Un petit programme pour compter les voyelles. - C - Programmation
Marsh Posté le 27-11-2003 à 21:37:31
regarde la doc de strpbrk() (la partie sur la valeur de retour)
Marsh Posté le 27-11-2003 à 21:42:52
Et si la phrase test n'a pas de voyelle, il va y avoir pb avec ce code...
A+,
Marsh Posté le 27-11-2003 à 21:48:52
ça retourne un pointeur sur la première occurence, j'ai essayé de me baser sur l'exemple qu'ils donnent :
Return Value
Returns a pointer to the first occurrence of any character from strCharSet in string, or a NULL pointer if the two string arguments have no characters in common.
Code :
|
Output
1: The 3 men and 2 boys ate 5 pigs
2: 3 men and 2 boys ate 5 pigs
3: 2 boys ate 5 pigs
4: 5 pigs
Edit : Pour le problème "d'aucune correspondance", je peux vérifier si un NULL est présent avant le while et retourner 0.
Marsh Posté le 27-11-2003 à 21:57:18
Master_Jul a écrit : ça retourne un pointeur sur la première occurence, j'ai essayé de me baser sur l'exemple qu'ils donnent :
|
et que ce passe-t-il si tu rajoutes
Code :
|
à la fin du programme d'exemple ?
[edit] damned le printf de crosoft est protégé contre les pointeurs nuls pour les chaines de caractères, c'est même pas drôle ca plante pas.
Marsh Posté le 27-11-2003 à 22:15:32
SquiZz : ça renvoit la même chose que 4
chrisbk : si seulement...
il faut que je donne tableau des valeurs et arguments, plus définition, plus faire un programme d'exemple pour strcpy, strcat, strncat, strcmp, strncmp, strrev, strset, strstt...
Je n'ai d'exemple imposé que pour strpbrk, pour les autres, je peux inventer ce qui me branche alors ça va.
Marsh Posté le 27-11-2003 à 22:32:03
pourquoi ce programme pourrait-il planter ?
(hint : pointeur, NULL)
est ce que
Code :
|
peut te renvoyer un pointeur sur le caractère de fin de chaîne '\0' alors qu'il ne fait pas partie des caractères que tu recherches ?
Quand est ce que
Code :
|
te retourne NULL ?
Marsh Posté le 27-11-2003 à 22:47:24
putain je me barre une soirée et c'est le bordel ! et les std::string, et std::string::find_first_of, etc
Marsh Posté le 27-11-2003 à 22:48:19
Taz a écrit : putain je me barre une soirée et c'est le bordel ! et les std::string, et std::string::find_first_of, etc |
void main(void)
Marsh Posté le 27-11-2003 à 22:54:05
Ah ouais OK, s'il ne regarde pas fin de chaine, je fais un
while (i<strlen(chaine))
{
i++;
...
}
Je peux rencontrer un NULL quand il n'y a pas/plus de correspondance, mais est qu'un NULL peut faire planter le pg ?
Marsh Posté le 27-11-2003 à 22:58:47
Taz a écrit : putain je me barre une soirée et c'est le bordel ! et les std::string, et std::string::find_first_of, etc |
J'ai pas encore appris à me servir de ça.
Je pense pas que ça soit vital pour mon programme.
Marsh Posté le 27-11-2003 à 22:59:42
Master_Jul a écrit : Ah ouais OK, s'il ne regarde pas fin de chaine, je fais un |
ce qui marchera uniquement si toutes les lettes de ta chaine sont des voyelles.
Master_Jul a écrit : |
un NULL ne fait pas planter un programme, déréférencer un pointeur nul, si.
et si il n'y a plus de correspondance, ca ne voudrait pas dire par un hazard improbable qu'il ne reste plus de voyelles dans ta chaine ?
Marsh Posté le 27-11-2003 à 23:07:06
Je ne comprend pas le "déférencement de pointeur"
On écrit ça comme ça ?
while (*p!='NULL')
{
p=strpbrk(p,voyelles);
cout <<p<<endl;
p++;
xvoy++;
}
ou
while (p!='NULL')
Marsh Posté le 27-11-2003 à 23:13:28
Master_Jul a écrit : Je ne comprend pas le "déférencement de pointeur" |
déréférencement de pointeur =>
Code :
|
Y a de l'idée dans la première solution sauf qu'elle compile pas, c'est pas comme ca qu'on teste un pointeur nul, mais alors pas du tout.
et en plus ca marcherait pas même si ca compilait.
test de pointeur :
Code :
|
(PS : c'est un troll ou quoi ?)
Marsh Posté le 27-11-2003 à 23:20:40
Je suis conscient d'être un gros boulet mais j'ai vraiment du mal sur ce coup.
Je change d'idée, mais je sens que ça devient de plus en plus con, je fais une boucle infinie que je casse quand je rencontre un NULL suivant la syntaxe que tu m'as donné :
Code :
|
Maintenant je vois pas le problème avec le pointeur, quand je fais un :
p=strpbrk(p,voyelles);
Ca veut dire que je stocke un pointeur dans p qui en est déjà un... ah c'est peut être ça le hic.
Marsh Posté le 27-11-2003 à 23:27:23
bon si c'est un devoir => pas de commentaires => 0/20.
=> return dans un while(1) => 0/20.
pourquoi ta première solution n'aurait pas marché :
Code :
|
a la fin de la recherche, en /*a*/ on se retrouve avec un pointeur nul, super.
en /*b*/, pas de bol on ajoute 1 au pointeur.
donc en /*c*/ le test foire parce que que le pointeur ne vaut pas nul.
une solution qui marche [edit ou qui devrait marcher ]:
Code :
|
[edit]viré le commentaire, dis moi pourquoi ca devrait marcher.
Marsh Posté le 27-11-2003 à 23:35:02
A tout hasard (j'avoue), j'avais essayé de mettre le p++; avant de tester mais ça devait pas être au moment où je testais la bonne chose (cf. le !='\0')
En tout cas, j'ai compris mes erreurs, merci pour toutes tes explications, je promet de me creuser un peu plus la tête la prochaine fois. Je devrai utiliser un peu plus le debugger en pas à pas à mon avi.
Encore merci !
Edit : J'ai vu avant l'edit mais j'aurai compris, j'ai déjà rencontré ce genre de bourde avec les chaines quand on récupèrait la longueur de celle-ci "à la main" en recherchant le terminator.
Marsh Posté le 27-11-2003 à 23:47:46
Taz a écrit : quelqu'un pour déplacer ça dans la cat C ? |
tiens j'avais pas fait gaffe à la cat.
Quoi que c'est a moitié du C++, y a des 'cout'
Marsh Posté le 27-11-2003 à 23:49:30
ReplyMarsh Posté le 28-11-2003 à 00:09:23
SquiZz a écrit : |
J'ai deplacé parce que sinon le Taz nous faisait une attaque d'apoplexie
Z'etes dur avec lui de poster ca dans la cat C++, alors que c'est du C plusplus-isant.
A+,
Marsh Posté le 28-11-2003 à 00:16:52
Bon sinon, pour M_J, j'explicite ma remarque:
Code :
|
Si tu n'as pas de voyelle dans szPhrase p sera mis a NUL. Or ton test se fait sur *p
A+,
Marsh Posté le 28-11-2003 à 00:45:04
Tiens, un exemple de solution en pur C
Reecris donc ca ensuite en vrai C++ pour faire plaisir a Taz
J'ai modifie certains de tes identificateurs pour les mettre plus conformes aux habitudes du code C
Au fait, main est pas du prototype que tu avait mis, meme si ton compilo l'accepte
Code :
|
A+,
Marsh Posté le 28-11-2003 à 01:17:16
pour ceux qui veulent je faire en C++, plusieurs solutions simples :
- une boucle avec std::string::find_first_of
- std::count_if + ce_qu'_il_faut
Marsh Posté le 28-11-2003 à 04:58:20
j'ai bon ?
Code :
|
Marsh Posté le 28-11-2003 à 08:57:38
oui sauf la variable globale (de visibilité externe qui plus est) qui est très laide. et quand on peut le faire, on utilise le constructeur avec argument et pas l'initialisation par copie. quelque parenthèse en trop
Marsh Posté le 28-11-2003 à 13:01:44
ouais la globale j'en étais pas très fier, et pour les parenthèses c'était une norme de mon ancien bahut de merde, qui disait qu'il fallait en mettre après chaque mot clé (for, sizeof, if, return, etc).
sinon ok pour le constructeur, j'y pense jamais mais faudrait.
et tout compte fait cette solution me semble mieux :
(enfin plus simple, et y a pas une fonction Bordel() qui traine)
Code :
|
Marsh Posté le 28-11-2003 à 13:30:38
Et les voyelles accentuées, faut les compter aussi ?
Marsh Posté le 28-11-2003 à 13:35:19
ReplyMarsh Posté le 28-11-2003 à 13:48:03
Y a des cas sympathiques par ex en néerlandais "ij" peut s'écrire "ÿ", ça fait une voyelle + une consonne
Marsh Posté le 28-11-2003 à 20:29:39
quelqu'un pour déplacer ça dans la cat C++ ? (spéciale dédicace à Taz ^2
Marsh Posté le 29-09-2009 à 18:12:38
Salut, moi aussi je dois faire un compteur de voyelle dans une phrase se terminant par *
Voila deja ce que j'ai fais.
Code :
|
Voila , sa marche parfaitement si je colle tout mais des que je met des espaces dans ma phrase sa m'affiche un nombre de voyelle erronés pourquoi cela ? Merci de vos explication !
Marsh Posté le 29-09-2009 à 21:36:18
Renseigne toi sur l'utiliisation du scanf !
La saisie des chaines au clavier se fait avec fgets(buf, sizeof buf, stdin).
Marsh Posté le 30-09-2009 à 23:25:32
keek007 a écrit :
|
Supaire !!!
Marsh Posté le 01-10-2009 à 02:09:16
Salut les bizus de tek1
J'ai pas regardé si la réponse a été postée, trop de flood.
en C pur et dur sans fonction de la bibli pour compter le nombre de voyelles d'une phrase on a : (a la norme en plus !)
Code :
|
Voilou
Marsh Posté le 27-11-2003 à 21:23:05
Je cherche à compter les voyelles d'une chaine, le "cout" qui me sert à voir ce qui se passe me montre bien que le programme trouve ce qu'il faut mais il plante avant le retour de la fonction, quel est le problème ?
Message édité par Master_Jul le 28-11-2003 à 00:07:26