CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

aide exo C (pointeurs)

tomtex
tomtex
Niveau 8
06 février 2009 à 18:10:05

salut,
j'ai un petit exo de C et j'ai un problème :snif:
alors il faut entrer une chaine de caractère et rechercher sur le caractère qu'on veut est présent dans la chaine. Si il est présent, il faut que la fonction retourne un pointeur vers le caractère dans la chaine de caractère, ou null si introuvable.

exemple :
mot : essai
je cherche : a
la fonction doit donc retourner un pointeur vers le a dans essai

exemple 2 :
mot : essai
je cherche z
la fonction doit donc retourner null

le problème dans mon programme, si je fais :
mot : essai
je cherche : a
la fonction me renvoie ai
donc en fait la fonction me renvoie à partir du caractère trouvé et pas seulement le caractère trouvé
je pense que le problème est à l'endroit : p=s ;
merci d'avance pour votre aide parce que là je bloque.

  1. include <stdio.h>

char *mon_strchr(char *s, char c){
char *p ;
while(*s!='\0'){
if(*s==c){
p=s ;
return p ;
}
s=s+1 ;
}
p="null" ;
return p ;
}

int main(int argc, char *argv){
char c='a' ;
char mot[]="essai" ;
char *pointeur ;
pointeur=mot ;
printf("%s\n", mon_strchr(pointeur, c)) ;
printf("%s\n", pointeur) ;
}

godrik
godrik
Niveau 30
06 février 2009 à 18:41:30

Salut,

Ton erreur est rigolote parce que ce n'est pas la fonction qui est en cause mais ta procedure de test.
printf("%s\n", mon_strchr(pointeur, c)) ;
Tu affiche %s donc une chaine de caractere. En C, une chaine de caractere est commence sur le pointeur et termine au premier '\0'. donc forcement. printf ecrit "ai" puisque ta fonction pointe sur le a.

Si tu veux afficher un seul caractere et pas une chaine de caractere, le format dans printf est %c. Attention, il afut alors fournir un caractere (et pas un pointeur vers un caractere).

De plus, je pense que si elle n'est pas trouve, il faut pointer sur NULL et pas sur "null" :). C'est a dire sur 0 et pas sur une chaine de caractere qui contient "null". Verifie l'enonce de ton exercice. (attention, dereferencer NULL amene a une erreur de segmentation)

tomtex
tomtex
Niveau 8
06 février 2009 à 20:44:31

heu j'ai essayé un peu ce que tu m'as dis, mais je n'y arrive pas :snif:

j'ai essayé de mettre printf("%c\n", mon_strchr(mot, c)) ; mais maintenant il affiche des caractères bizarres.

:snif:

godrik
godrik
Niveau 30
06 février 2009 à 22:14:45

hehe, tu as oublie mon message entre parenthese.
mon_strchr renvoie un pointeur sur le caractere qui t'interesse
il faut donc utiliser * mon_strchr(...)

tomtex
tomtex
Niveau 8
07 février 2009 à 10:02:33

je dois mettre ça :
printf("%c\n", *mon_strchr(mot, c)) ?

mais sa me met erreur de segmentation :snif2:

tomtex
tomtex
Niveau 8
07 février 2009 à 10:06:03

a non finalement c'est bon, j'avais laissé %s :hum:

donc maintenant le problème est réglé, merci beaucoup pour ton aide godrik :-)

tomtex
tomtex
Niveau 8
07 février 2009 à 10:10:24

a non maintenant quand le caractère n'est pas trouvé sa marche plus (erreur de segmentation), pourtant j'ai changé pour NULL :

  1. include <stdio.h>

char *mon_strchr(char *s, char c){
char *p ;
while(*s!='\0'){
if(*s==c){
p=s ;
return p ;
}
s=s+1 ;
}
p=NULL ;
return p ;
}

int main(int argc, char *argv){
char c='p' ;
char mot[]="essai" ;
char *pointeur ;
pointeur=mot ;
printf("%c\n", *mon_strchr(mot, c)) ;
printf("%s\n", pointeur) ;
}

elhuron
elhuron
Niveau 6
07 février 2009 à 11:09:55

Tu devrais rajouter quelques lignes pour tester la valeur de retour de la fonction. Car si ca renvoi NULL, tu essai d'afficher le caractère à l'adresse NULL.

char* pc = mon_strchr(mot, c);
if (pc == NULL)
{/*...*/}
else
{/*...*/}

tomtex
tomtex
Niveau 8
07 février 2009 à 11:44:09

salut,
j'ai essayé, mais sa marche toujours pas :snif2: :snif2: :snif2:
encore une erreur de segmentation quand ça devrais marquer NULL, la faute est surrement à l'avant dernière ligne mais je n'arrive pas à la corriger

  1. include <stdio.h>

char *mon_strchr(char *s, char c){
while(*s!='\0'){
if(*s==c){
return s ;
}
s=s+1 ;
}
return NULL ;
}

int main(int argc, char *argv){
char c='z' ;
char mot[]="essai" ;
char *pointeur ;
pointeur=mot ;
char *pc=mon_strchr(pointeur, c) ;
if(pc!=NULL)
printf("%c\n", *mon_strchr(mot, c)) ;
else
printf("%s\n", pc) ;
}

dnob700
dnob700
Niveau 10
07 février 2009 à 12:22:10

quand pc est différent de NULL, tu n'as pas besoin de réappeler mon_strchr, vu que le résultat est déjà dans pc. Tu mets juste '*pc' dans l'appel à printf.

Dans le cas où c'est égale à NULL, c'est idiot d'essayer de l'afficher, vu que c'est la même chose que juste avant. Affiche que le caractère n'a pas été trouvé.

Vu la succession de tes post (4 minute entre un post et le problème suivant), je ne crois pas que tu réfléchisse réellement à ton problème. Lorsque tu bloque, essaye un minimum de regarder ce qui ne vas pas, de faire des tests, etc. Si tu viens ici instantanément pour obtenir des morceaux de programmes, tu ne progresseras pas dans ta capacité à écrire des programme. Si après avoir cherché, tu ne réussi pas à faire ce que tu veux, par contre, là, tu peut toujours venir poster pour te l'aide. Mais il faut que tu ais cherché par toi même avant.

elhuron
elhuron
Niveau 6
07 février 2009 à 14:27:21

Au passage, le deuxieme paramètre à entrer dans ta fonction main, c'est un tableau de chaine : int main (int argc, char* argv[]) {/*...*/}

tomtex
tomtex
Niveau 8
07 février 2009 à 17:29:53

ouais j'avais pensé à faire printf("NULL") mais je pensais qu'on pouvait faire autrement.

bon j'avoue que ce matin j'ai pas beaucoup cherché entre mes posts, je n'avais pas le courage vu que hier je m'étais déjà pris la tête un bon moment avec ce programme.

ElHuron : exact, heureusement que gcc n'est pas trop exigeant :-d (il accepte même seulement main()).

bon donc cette fois c'est bon, merci à tous.

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment