Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 08/09/2008, à 22:00

binoua

[Resolu]Les bases du C

yop,

Je programme pas mal en C et je pense avoir atteint un niveau correct.
Or mon j'ai un bug tres bizarre avec mon programme. Donc je me demande s'il y
a une base que je n'ai pas compris.
Avec mon compilateur (à jour) ca bug et avec le compilateur de la fac (pas à jour) ça bug pas.


int main (void){
	int lSeq=20,i;
	char seq[20]="AGCTGCGTGCCATGCCCATG";
	char arn[20];
	
// 	char *arn = (char *) calloc (20,sizeof(char));
	
	
	for (i=0; i<lSeq; i++){
		if (seq[i] == 'T') arn[i] = 'U';
		else arn[i] = seq[i];
	}
	
	printf("ADN : %s\nARN : %s\n",seq,arn);
	
	return 0;
}

Sans calloc ça marche pas, avec calloc ça marche....

Merci de votre aide

Dernière modification par binoua (Le 08/09/2008, à 22:48)

Hors ligne

#2 Le 08/09/2008, à 22:39

tiky

Re : [Resolu]Les bases du C

C'est une erreur classique de débutant. Les chaînes de caractères en C se terminent toujours par un caractère nul afin de les délimiter. http://fr.wikipedia.org/wiki/Cha%C3%AEne_de_caract%C3%A8res

Si tu oublies ce caractère, printf lira dans la mémoire jusqu'à le rencontrer ce qui provoquera un bug mais pas toujours. Voilà un code corrigé et nettoyé qui fonctionne.

                                                                             
#include <stdlib.h>                                                                                                       
#include <stdio.h>                                                                                                        
#define SIZE 20                                                                                                           
                                                                                                                          
int main( void )                                                                                                          
{                                                                                                                         
  int i;                                                                                                                  
  char seq[ SIZE + 1 ] = "AGCTGCGTGCCATGCCCATG";                                                                          
  char arn[ SIZE + 1 ];                                                                                                   
                                                                                                                          
  for( i = 0; i < SIZE; i++ )                                                                                             
    {                                                                                                                     
      if( seq[i] == 'T' )                                                                                                 
        arn[i] = 'U';                                                                                                     
      else                                                                                                                
        arn[i] = seq[i];                                                                                                  
    }                                                                                                                     
  arn[ SIZE ] = '\0';                                                                                                     
                                                                                                                          
  printf( "ADN : %s\nARN : %s\n", seq, arn );                                                                             
  return 0;                                                                                                               
}

Rq: Tu remarqueras le +1 pour la taille, c'est pour ajouter le caractère nul, il est explicitement ajouté pour seq[], mais tu dois l'ajouter toi-même pour arn[].

Dernière modification par tiky (Le 08/09/2008, à 22:41)


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#3 Le 08/09/2008, à 22:40

qqun

Re : [Resolu]Les bases du C

salut ,


tu devrait rajouter un caractère nul '\0' a la fin du taleau arn[]
et dimensionner tes tableaux a N+1 .

http://www.commentcamarche.net/c/cstring.php3

#4 Le 08/09/2008, à 22:48

binoua

Re : [Resolu]Les bases du C

gagné !!!
bon ben du coup j'ai bien honte de moi !!!

merci bien

Hors ligne

#5 Le 09/09/2008, à 21:23

robrob

Re : [Resolu]Les bases du C

Quelques variantes:
- avec strlen pour connaître la taille d'une chaîne
- avec strcat pour ajouter une chaîne à une chaîne
- avec strncat pour ajouter un bout de chaîne donné à une chaîne

  ...
  size_t i;
  arn[0]='\0';   // initialise la chaîne de destination comme une chaîne vide
  for( i = 0; i < strlen(seq); i++ )                                                                                             
    {                                                                                                                     
      if( seq[i] == 'T' )                                                                                                 
        strcat(arn,"U");
      else                                                                                                                
        strncat(arn,seq+i,1);
    }

  printf( "ADN : %s\nARN : %s\n", seq, arn );  
  ...

-avec strcpy pour copier une chaîne de caractère (avec le \0)
-avec strchr pour cherche un caractère dans une chaîne:

  ...
  strcpy(arn,seq); // copie la chaîne
  char *pt=arn;    // initialise le pointeur de recherche au premier caractère de la chaîne
  do
  {
    pt=strchr(pt,'T'); // retourne le pointeur sur le premier caractère 'T' trouvé
    if (pt==NULL)
      break;  // pas de caractère 'T' trouvé, on sort
			
    *(pt++)='U';  // remplace le caractère courant par 'U', passe au caractère suivant
  }
  while(1);

  printf( "ADN : %s\nARN : %s\n", seq, arn );  
  ...

Ces fonctions nécessitent d'inclure string.h

Hors ligne

#6 Le 09/09/2008, à 21:28

robrob

Re : [Resolu]Les bases du C

A noter que tu peux remplacer

    char seq[20]="AGCTGCGTGCCATGCCCATG";
    char arn[20];

par

    char seq[]="AGCTGCGTGCCATGCCCATG";
    char arn[sizeof(seq)];

Hors ligne