Comparaison chaine caractère C

Fermé
Kelly - 20 janv. 2009 à 17:18
 Kelly - 20 janv. 2009 à 21:48
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

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 mercredi 17 octobre 2007 Statut Membre Dernière intervention 11 février 2009 6
20 janv. 2009 à 17:19
Ce serait bien que tu montres au moins ton code ;-)
0
alecol Messages postés 27 Date d'inscription mercredi 17 octobre 2007 Statut Membre Dernière intervention 11 février 2009 6
20 janv. 2009 à 17:22
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
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 vendredi 12 janvier 2007 Statut Membre Dernière intervention 11 mai 2009 44
20 janv. 2009 à 17:28
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
merci daronmaster;

Ca fonctionne maintenant, mais qu'entend tu par erreurs de segmentation?
0
daronmaster Messages postés 326 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 11 mai 2009 44
20 janv. 2009 à 17:36
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
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 vendredi 12 janvier 2007 Statut Membre Dernière intervention 11 mai 2009 44
20 janv. 2009 à 17:38
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
bonne idée merci à toi ^^
0
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 vendredi 12 janvier 2007 Statut Membre Dernière intervention 11 mai 2009 44
20 janv. 2009 à 17:58
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 samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 860 > daronmaster Messages postés 326 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 11 mai 2009
20 janv. 2009 à 21:00
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 vendredi 12 janvier 2007 Statut Membre Dernière intervention 11 mai 2009 44 > bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015
20 janv. 2009 à 21:03
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 samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 860 > daronmaster Messages postés 326 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 11 mai 2009
20 janv. 2009 à 21:07
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 vendredi 12 janvier 2007 Statut Membre Dernière intervention 11 mai 2009 44 > bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015
20 janv. 2009 à 21:13
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
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 vendredi 12 janvier 2007 Statut Membre Dernière intervention 11 mai 2009 44
20 janv. 2009 à 18:03
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
ah merci daronmaster je regarde tout ça
0
guillaume_74 Messages postés 111 Date d'inscription samedi 18 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 22
20 janv. 2009 à 18:07
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
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 vendredi 12 janvier 2007 Statut Membre Dernière intervention 11 mai 2009 44
20 janv. 2009 à 18:11
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
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 vendredi 12 janvier 2007 Statut Membre Dernière intervention 11 mai 2009 44
20 janv. 2009 à 18:29
bon courage alors, et n'oublies pas de passer en résolu ....

bye
0
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
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
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 jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
20 janv. 2009 à 20:43
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
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 jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
20 janv. 2009 à 20:49
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