Comparaison chaine caractère C

Kelly -  
 Kelly -
Bonjour,

J'ai fait un petit (et ridicule) programme qui regarde si une chaine de caractère est contenue dans un tableau mais il ne fonctionne pas correctement.
Pouvez me dire où ça coince svp je ne comprends pas pourquoi.
merci
A voir également:

24 réponses

Kelly
 
comme une idote que je suis j'ai oublié de posté le code :S
le voilà:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char* ligne1 [8]={"olivier","jerome","maman","papa","sisi","nana","pipi","popo"};


int main(){
int i;
char* station;
printf("station?:");
scanf("%c",& station);
printf("\n");

for(i=0;i<10;i++){
if(station==ligne1[i])
printf("station est sur ligne\n");
else printf ("station pas sur ligne");
}
return 0;
}
0
alecol Messages postés 27 Date d'inscription   Statut Membre Dernière intervention   6
 
Ce serait bien que tu montres au moins ton code ;-)
0
alecol Messages postés 27 Date d'inscription   Statut Membre Dernière intervention   6
 
Je n'avais pas vu que c'était en C, je n'y connais rien, mais est-ce que la variable station à été initialisée? :-)
0
Kelly
 
Oui elle a été initialisée normalement puisque je demande a l'utilisateur d'entrer un nom de station.
je te remercie pour ta réponse en tout cas :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   44
 
bonjour,

la comparaison de chaine ne se fait pas comme ça en C, il faut utiliser strcmp inclus dans string.h

ensuite attention aux erreurs de segmentation avec tes char *

:::::::::::::::::::::::::

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char* ligne1 [8]={"olivier","jerome","maman","papa","sisi","nana","pipi","popo"};


int main(){
int i;
char station[128];
printf("station?:");
scanf("%s",station);
printf("\n");

for(i=0;i<8;i++){
if(strcmp(station,ligne1[i]) == 0)
printf("station est sur ligne\n");
else printf ("station pas sur ligne");
}
return 0;
}
0
Kelly
 
merci daronmaster;

Ca fonctionne maintenant, mais qu'entend tu par erreurs de segmentation?
0
daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   44
 
tu faisais:

char *station;

et un scanf (scanf("%s",&station) dessus sans allouer de mémoire avec un "malloc" si tu connais et en plus tu passais l'adresse (&) d'un pointeur pour écrire dessus ???

donc voilà

si je n'ai pas été assez clair, je repondrai à d'autres de tes questions.
0
Kelly
 
en fait ça ne fonctionne pas tout a fait, ça me met "station pas sur ligne quelque soit le nom que j'entre!
0
daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   44
 
essai de faire un printf de ce qui a été saisi par l'utilisateur (toi en l'occurence) et vois si la variable station contient bien la valeur saisi.

je dois t'avouer qu'il y a bien longtemps que je n'ai pas fait de C
0
Kelly
 
bonne idée merci à toi ^^
0
Kelly
 
hé bien maintenant quand je lance le programme j'ai un message d'erreur du type "métro.exe a cesser de fonctionner".

j'ai rien touché pourtant , sauriez vous d'ou ca peut venir?
0
daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   44
 
voici ce que j'ai fait et ça marche :


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char* ligne1 [8]={"olivier","jerome","maman","papa","sisi","nana","pipi","popo"};


int main(){
int i;
char station[128];
printf("station ?\t");
scanf("%s",station);
printf("%s\n",station);

int booleen = 0;

for(i=0;i<8 && !booleen;i++){

	if(strcmp(station,ligne1[i]) == 0){

		booleen=1;
	}
}

if(booleen){
	printf("station est sur ligne\n");
}
else{ printf ("station pas sur ligne");}

return 0;
} 

0
bizu53 Messages postés 1274 Date d'inscription   Statut Membre Dernière intervention   861 > daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention  
 
Peut-être que ton compilateur l'autorise mais en langage C les variables sont déclarées au début.

int main(){
int i, booleen = 0;
char station[128];
printf("station ?\t");
scanf("%s",station);
printf("%s\n",station);
0
daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   44 > bizu53 Messages postés 1274 Date d'inscription   Statut Membre Dernière intervention  
 
pour info tu as bien raison mon compilo l'autorise et avec gcc -Wall zéro warning ou autre.

ensuite si tu veux respecter certaines normes effectivement il faut déclarer les variables et les initialiser au début de la fonction mais ce n'est que du détail ....

0
bizu53 Messages postés 1274 Date d'inscription   Statut Membre Dernière intervention   861 > daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention  
 
Ce n'est pas parce que c'est du détail qu'il ne faut pas en tenir compte. D'autant plus que tu dis "voici ce que j'ai fait et ça marche" ... ça marche avec tes options de compilation..qui ne sont pas forcément celles de tout le monde. En faisant du code rigoureux, ça marche partout quelques soient les options.

Ce n'était pas du dénigrement mais simplement une remarque.
0
daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   44 > bizu53 Messages postés 1274 Date d'inscription   Statut Membre Dernière intervention  
 
ok, je te l'accorde, la prochaine fois je préviendrai sous quel OS je suis et quels sont les outils utilisés pour créer compiler, éxécuter ... enfin bref, je serai plus rigoureux ou sinon je laisserai les gens galèrer ...

Sur ce, bien que cela n'ait été qu'une remarque moi ça me saoule ce genre de remarques qui ne font pas avancer les choses

Cordialement,

moi

0
Kelly
 
voilà le code avec quelque modifications<;
j'ai rajouté le malloc sizeof char mais ca ne fonctionne toujours pas


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char* ligne1 [8]={"olivier","jerome","maman","papa","sisi","nana","pipi","popo"};


int main(){
int i;
char* station;
station = malloc (sizeof (char));

printf("station?:");
scanf("%s",& station);
printf("\n");
for(i=0;i<8;i++){
if(strcmp(station,ligne1[i]) == 0)
printf("station est sur ligne\n");
else
printf ("station pas sur ligne");

}
system("PAUSE");
return 0;
}
0
daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   44
 
c'est normal si tu fais un malloc(sizeof(char)), tu n'alloues qu'une case mémoire pour un char il faudrait que tu fasse malloc(UN_ENTIER_A_DETERMINER * sizeof(char)) ou UN_ENTIER_A_DETERMINER est une valeur à définir par tes propres soins et de type int.

et il ne faut pas oublier de caster ton malloc avec le type du pointeur, c'est "mieux" :

char *station = (char *)malloc(UN_ENTIER_A_DETERMINER * sizeof(char))

0
Kelly
 
ah merci daronmaster je regarde tout ça
0
guillaume_74 Messages postés 111 Date d'inscription   Statut Membre Dernière intervention   22
 
char* station;
printf("station?:");
scanf("%c",& station);


Houlaaaa! Si tu veux mettre une chaine de charactère....
c'est scanf("%s",station);

expliquation:
tu déclare un pointeur (char * station)
donc pas besoin de mettre un &.

sinon oui, un strcmp fait l'affaire ;)
ça renvoie 0 si les deux chaines sont identiques.
0
Kelly
 
magnifique, ça fonctionne!!! merci daronmaster;
peux tu m'expliquer l'utilité du booleen stp?

pour le malloc je vais devoir lire un bon tuto sur son utilisation. pour l'instant je vais m'en passé puisque ta version fonctionne
0
daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   44
 
le fait d'utiliser le booleen evite de parcourir tout ton tableau de chaine. en effet dès que la station est trouvée, tu stoppes la recherche.

voili voilou
0
Kelly
 
Merci bcp, je n'avais meme pas remarqué le %c!
Je vais pouvoir passer a la suite de mon programme ;)

En fait il fait que je fasse un programme qui calcule des itinéraires dans le métro parisien, mais bon je pense que vous l'aviez deviné ^^
0
daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   44
 
bon courage alors, et n'oublies pas de passer en résolu ....

bye
0
Kelly
 
me revoilà;

J'ai rencontré un autre problème. la il s'agit d'entrer une station de départ et une station d'arrivée.
le programme doit me dire sur quelle ligne sont chaque station; mais ça ne fonctionne pas très bien quand il faut qu'il me renvoie la station d'arrivée, parfois il me renvoie 0.
Voyez vous ce qui cloche? je sèche completement
merci
0
Kelly
 
voilà le code:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char* ligne1 [8]={"olivier","jerome","maman","papa","sisi","nana","pipi","popo"};
char* ligne2 [8]={"nina","loise","maman","arnaud","daftpunk","digitalism","css","chemicalbrothers"};

int main(){
int i;
char depart[128];
char arrivee[128];
int booleen=0;
int dep=0;
int arr=0;
printf("station de depart?:");
scanf("%s",depart);
printf("vous partez de: %s\n\n",depart);
printf("station d'arrivee?:");
scanf("%s",arrivee);
printf("vous voulez aller a: %s\n\n",arrivee);


for(i=0;i<8 && !booleen;i++){

if(strcmp(depart,ligne1[i])==0){
dep=1;
}
else if(strcmp(depart,ligne2[i])==0){
dep=2;
}

if(strcmp(arrivee,ligne1[i])==0){
arr=1;
}
else if(strcmp(arrivee,ligne2[i])==0){
arr=2;
}
booleen = 1;
}

if(booleen){
printf("la station de depart est sur la ligne %d\n",dep);
printf("la station d'arrivee est sur la ligne %d\n",arr);
}

else{ printf ("station pas sur ligne");}
system("PAUSE");

return 0;
}
0
Kelly
 
personne ne voit ce qui ne va pas dans le code? Je ne vois pas du tout où ça coince, j'aurais besoin d'aide svp
0
mype Messages postés 2435 Date d'inscription   Statut Membre Dernière intervention   437
 
tu utilises mal ton booleen
essaye comme ça
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char* ligne1 [8]={"olivier","jerome","maman","papa","sisi","nana","pipi","popo"};
char* ligne2 [8]={"nina","loise","maman","arnaud","daftpunk","digitalism","css","chemicalbrothers"};

int main(){
int i;
char depart[128];
char arrivee[128];
int booleen=0;
int dep=0;
int arr=0;
printf("station de depart?:");
scanf("%s",depart);
printf("vous partez de: %s\n\n",depart);
printf("station d'arrivee?:");
scanf("%s",arrivee);
printf("vous voulez aller a: %s\n\n",arrivee);


for(i=0;i<8 && booleen<2;i++){

if(strcmp(depart,ligne1[i])==0){
dep=1; booleen++;

}
else if(strcmp(depart,ligne2[i])==0){
dep=2; booleen++;

}

if(strcmp(arrivee,ligne1[i])==0){
arr=1; booleen++;

}
else if(strcmp(arrivee,ligne2[i])==0){
arr=2; booleen++;

}
}

if(booleen){
printf("la station de depart est sur la ligne %d\n",dep);
printf("la station d'arrivee est sur la ligne %d\n",arr);
}

else{ printf ("station pas sur ligne");}
system("PAUSE");

return 0;
}
0
Kelly
 
Ca fonctionne très bien, merci mype!

Tu peux m'expliquer pourquoi il faut faire une incrémentation sur le booleen stp?
0
mype Messages postés 2435 Date d'inscription   Statut Membre Dernière intervention   437
 
pour indiquer qu'une station a été trouvé on incremente le booleen quand il arrive a 2 les deux stations on été trouvé donc on sort de la bouble for
0