C lire le contenu d’une chaîne à partir d’un fichier et comparer l’égalité

Je lis le contenu d’un fichier et je m’attends à rechercher une valeur particulière, disons “Londres”. pour cela, je lis le contenu, le marque par “\ n”, puis compare chaque valeur à “london” avec “strcmp”.

Mais je pense que je ne comprends toujours pas comment C stocke les données et effectue des comparaisons. Par conséquent, mon code ci-dessous ne fonctionne pas comme prévu. Je suppose qu’il me manque des connaissances fondamentales en C ici, aidez-moi:

LIGNE DE COMMANDE DE TEST:

./myprogram datafile.txt "london" 

INPUT datafile.txt:

 london manchester britain ... 

CODE myprogram.c:

 int main(int argc, char **argv) { FILE* fl; char st1[2000]; char * buffer = 0; long length; fl = fopen (argv[1], "r"); //the data file content is shown above if (fl){ fseek (fl, 0, SEEK_END); length = ftell (fl); fseek (fl, 0, SEEK_SET); buffer = malloc (length+1); if (buffer){ //fread (buffer, 1, length, fl); fread(buffer, sizeof(char), length, fl); buffer[length] = '\0'; } fclose (fl); }else{ printf("data file not found"); return -1; } //firstly let's compare the value passed by command line with "london" strcpy(st1, argv[2]); if(strcmp(st1,"london")==0) printf("equals\n"); //as expected, I get "equals" printed else printf("unequal\n"); //now let's compare the values extracted from the data file, char* entity = strtok(buffer, "\n"); while (entity != NULL) { strcpy(st1, entity); //copy the value from the char pointer entity to the char array st1 so we can compare with other ssortingngs printf("%s\n", st1); //this prints london, .... if(strcmp(st1,"london")==0) printf("equals\n"); //I was expecting this.. else printf("unequal\n"); //but i got this... entity = strtok(NULL, "\n"); } return 0; 

}

Je m’attends à ce que le programme ci-dessus produise les résultats suivants:

 equals london equals manchester unequal britain unequal ... 

mais je ne comprends pas pourquoi je reçois

 equals london unequal <=============== why and how to fix? manchester unequal britain unequal ... 

Et comment devrais-je le changer pour que la valeur “london” lue dans le fichier soit égale à la “chaîne” réelle de “london”?

Merci beaucoup

J’essaie les choses suivantes et je remplace l’appel de strcpy par strncpy . Votre problème initial était le “0” à la fin de la variable st1 . Donc, vous pouvez faire ceci:

  while (entity != NULL) { strncpy(st1, entity,strlen(entity)-1); //copy the value from the char pointer entity to the char array st1 so we can compare with other ssortingngs printf("%s\n", st1); //this prints london, .... if(!strcmp(st1,"london")) printf("equals\n"); //I was expecting this.. else printf("unequal\n"); //but i got this... entity = strtok(NULL, "\n"); } 

Ou bien l’autre solution consiste à mettre le “0” vous-même à la fin de st1 comme ceci:

 strcpy(st1, entity); st1[strlen(entity)-1] = '\0'; 

Je teste les deux et ça marche.