Problème-Programmation C++
Résolu
Angelica
-
Angelica -
Angelica -
Bonjour! Je suis débutante en C++ et j'ai un exercice à faire. Mon compilateur ne me renvoie aucune erreur, mais quand je tape ma séquence de caractères au clavier, par exemple: 'Bonjour toi', mon programme ne prend seulement compte de ce qui est avant les espaces, donc 'Bonjour'.
Voici l'énoncé de l'exercice :
Écrire une fonction dont le prototype est int supprimer_espace_en_plus (char chaine[]); . Cette fonction prend une chaîne de caractères en paramètres et retourne un entier. La fonction supprimer_espace_en_plus() remplace un ensemble de caractère espace ' ' consécutifs dans chaine par un seul caractère espace retourne le nombre de caractères espace ' ' qui sont restés dans chaine.
Voici ce que j'ai fait :
#include <iostream>
#include <string.h>
int supprimer_espace_en_plus (char chaine[]) {
int i ;
int compteur = 0 ;
for (i=0 ; i<strlen(chaine) ; i++) {
if (chaine[i] == 32) {
compteur++ ;
if (chaine[i+1] == 32) {
for (i=(i+1) ; i <= strlen(chaine) ; i++) {
i = (i-1) ;
}
}}
}
return compteur ;
}
main () {
char chaine[100] ;
int compteur ;
printf("Entrer une chaine de caractere : \n") ;
scanf("%s", &chaine);
printf("Voici la chaine de caracteres que vous avez entre : %s\n",chaine);
compteur = supprimer_espace_en_plus (chaine) ;
printf("Votre nouvelle chaine devient : %s\n",chaine);
printf("Le nombre de caracteres espace restant est : %d\n",compteur);
return 0 ;
}
Coorrigez-moi s'il vous plaît! Merci beaucoup pour votre aide!!!
Voici l'énoncé de l'exercice :
Écrire une fonction dont le prototype est int supprimer_espace_en_plus (char chaine[]); . Cette fonction prend une chaîne de caractères en paramètres et retourne un entier. La fonction supprimer_espace_en_plus() remplace un ensemble de caractère espace ' ' consécutifs dans chaine par un seul caractère espace retourne le nombre de caractères espace ' ' qui sont restés dans chaine.
Voici ce que j'ai fait :
#include <iostream>
#include <string.h>
int supprimer_espace_en_plus (char chaine[]) {
int i ;
int compteur = 0 ;
for (i=0 ; i<strlen(chaine) ; i++) {
if (chaine[i] == 32) {
compteur++ ;
if (chaine[i+1] == 32) {
for (i=(i+1) ; i <= strlen(chaine) ; i++) {
i = (i-1) ;
}
}}
}
return compteur ;
}
main () {
char chaine[100] ;
int compteur ;
printf("Entrer une chaine de caractere : \n") ;
scanf("%s", &chaine);
printf("Voici la chaine de caracteres que vous avez entre : %s\n",chaine);
compteur = supprimer_espace_en_plus (chaine) ;
printf("Votre nouvelle chaine devient : %s\n",chaine);
printf("Le nombre de caracteres espace restant est : %d\n",compteur);
return 0 ;
}
Coorrigez-moi s'il vous plaît! Merci beaucoup pour votre aide!!!
A voir également:
- Problème-Programmation C++
- Application de programmation - Guide
- Programmation envoi sms - Guide
- Programmation binaire - Guide
- Programmation vb - Télécharger - Langages
- Programmation télécommande porte de garage brico depot - Forum Matériel & Système
17 réponses
#include <iostream> #include <string>//tu fait du C++, utilise les entete C++ de la STL int supprimer_espace_en_plus (char chaine[]) { int i ; int compteur = 0 ; for (i=0 ; i<strlen(chaine)-1 ; i++) {//sinon tu va avoir un depacement de tableau if (chaine[i] == 32) { compteur++ ; if (chaine[i+1] == 32) { for (j=(i+1) ; j <= strlen(chaine) ; j++) {// tu reboucle sur i, donc ça ne va pas, tu va sortir directement après cette boucle chaine[j]=chaine[j+1] ; } }} } return compteur ; } main () { char chaine[100] ; int compteur ; printf("Entrer une chaine de caractere : \n") ; //scanf("%s", &chaine); // J'utiliserai plutot une fonction de type getline std::string chaines; getline(std::cin,chaines); printf("Voici la chaine de caracteres que vous avez entre : %s\n",chaine); compteur = supprimer_espace_en_plus (chaine) ; printf("Votre nouvelle chaine devient : %s\n",chaine); printf("Le nombre de caracteres espace restant est : %d\n",compteur); return 0 ; }commentaire general:Vu que tu l'inclu, utilise plutot les string que les char[], c'est beaucoup plus simple
Ensuite, ta fonction (suprimer...) ne fait rien que retourner le nombre d'espace, elle ne modifie pas la chaine. J'ai un peu corrigé, mais je pense qu'il faut la revoir en profondeur. L'algorithme me semble avant tou faux, il faut bosser dessus avant de reprogrammer cette fonction
En fait, j'ai essayé ce que vous m'avez écrit, mais ça ne fonctionne en ajoutant dans la fonction int j ; car quand je tape une séquence de caractères quelconque au clavier, le programme m'affiche :
Voici la chaine de caracteres que vous avez entre : ÿÿÿÿÿÿÿÿ
Votre nouvelle chaine devient : ÿÿÿÿÿÿÿÿ
Le nombre de caracteres espace restant est : 0
Comment puis-je corriger le tout?
Voici la chaine de caracteres que vous avez entre : ÿÿÿÿÿÿÿÿ
Votre nouvelle chaine devient : ÿÿÿÿÿÿÿÿ
Le nombre de caracteres espace restant est : 0
Comment puis-je corriger le tout?
Pour détecter si un char est un espace, il est préférable d'utiliser la fonction isspace :
http://www.manpagez.com/missing.php
Pour construire la chaine qui nous intéresse onpeut utiliser la méthode append :
https://en.cppreference.com/w/cpp/string/basic_string/append
Bonne chance
http://www.manpagez.com/missing.php
Pour construire la chaine qui nous intéresse onpeut utiliser la méthode append :
https://en.cppreference.com/w/cpp/string/basic_string/append
extern "C"{ #include <ctype.h> } #include <string> std::string suppr_espace(const std::string & s){ std::string res; for(unsigned int i=0;i<s.size();++i){ if(!isspace(s[i])) res.append(1,s[i]); } return res; } ...
Bonne chance
Le problème c'est qu'on n'a pas encore vu la fonction isspace et la méthode append en classe... Comment puis-je le faire avec les notions de bases?
Merci quand même pour l'aide! ^_^
Merci quand même pour l'aide! ^_^
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Non mais attends tu les verras jamais en cours ces fonctions :p Il y a tellement de fonctions en C et C++ que tu les verras jamais toutes !!
Le truc, c'est que lire la doc pour utiliser des fonctions éprouvées est une bonne démarche en programmation. On n'est pas là pour réinventer la roue à chaque fois ;-)
Bonne chance
Le truc, c'est que lire la doc pour utiliser des fonctions éprouvées est une bonne démarche en programmation. On n'est pas là pour réinventer la roue à chaque fois ;-)
Bonne chance
Salut.
cela ne m'étonne pas que ce que j'ai donnée ne fonctionne pas. Je voulais indiquer un esprit de solution... Et l'algorithme de base etait totalement à revoir. Mais celui de Mamiemando me parait bien.
Je n'ai pas tester, il y a peut être des problèmes, à toi de voir.
cela ne m'étonne pas que ce que j'ai donnée ne fonctionne pas. Je voulais indiquer un esprit de solution... Et l'algorithme de base etait totalement à revoir. Mais celui de Mamiemando me parait bien.
int effac_espacce(char s[])//je remet char[] car c'est dans ton enoncer, string est mieu { char tmp[strlen(s)]; int compt=0; int j=0; for (int i=0;i<strlen(s)-1;i++) {if((s[i]==' ')&(s[i+1]!=' '))compt++; if((s[i]==' ')&(s[i+1]==' ')){continue;} tmp[j]=s[i]; j++; } tmp[j]=s[strlen(s)-1];tmp[j+1]='\0'; s=tmp;//un doute ici, mieu vaut strcpy(s,tmp); return compt; }
Je n'ai pas tester, il y a peut être des problèmes, à toi de voir.
vi, c'est ça.
Mais attention à ne pas confondre taille en mémoire et taille de la chaine.
La taille en mémoire, c'est ce qui est affiché entre les crochet.
la taille de la chaine, c'est le nombre de caractères jusqu'au caractère '\0'
d'ailleur, il y a peu être une erreur de ce coté la. par exmple, s=="123"
et que strlen(s)==3, alors tmp ayant pour taille 3, on risque d'avoir un problème, car la taille de "123" est 4 à cause du caractère nul.
Peu être mettre char tmp[sizeof(s)]; à la place.
je trouve le problème beaucoup plus simple en passant par une variable temporaire.
Mais attention à ne pas confondre taille en mémoire et taille de la chaine.
La taille en mémoire, c'est ce qui est affiché entre les crochet.
la taille de la chaine, c'est le nombre de caractères jusqu'au caractère '\0'
d'ailleur, il y a peu être une erreur de ce coté la. par exmple, s=="123"
et que strlen(s)==3, alors tmp ayant pour taille 3, on risque d'avoir un problème, car la taille de "123" est 4 à cause du caractère nul.
Peu être mettre char tmp[sizeof(s)]; à la place.
je trouve le problème beaucoup plus simple en passant par une variable temporaire.
Puisque tu ne veux pas utiliser append et les string, on va laisser le C++ et faire du C...
(merci de ne pas répondre "on n'a pas vu la fonction isspace() en cours".)
Bien penser à libérer l'espace mémoire occupé par la chaîne allouée par suppr_espace dans le main :
Bone chance
#include <ctype.h> #include <string.h> #include <stdio.h> char * suppr_espace(const char *s){ char *res=(char *)calloc(strlen(s)+1); unsigned int j=0; for(unsigned int i=0;i<s.size();++i){ if(!isspace(s[i])){ res[j]=s[i]; ++j; } } return res; }
(merci de ne pas répondre "on n'a pas vu la fonction isspace() en cours".)
Bien penser à libérer l'espace mémoire occupé par la chaîne allouée par suppr_espace dans le main :
int main(){ char *machaine="j'aime les tapirs"; char *plop=suppr_esapce(machaine); //... free(plop); return 0; }
Bone chance
Je veux bien t'aider, mais ou est le problème maintenant.
JE veux bien AIDER pas faire le travail à ta place.
la solution de mamiemando est fausse. si s est un char, il n'existe pas s.size().
Ensuite mamiemando, tu ne répond pas aux exigence de l'enoncer, au point de vue du prototype de fonction, et de ce qu'elle fait.
La fonction ne supprime que les espaces supplémentaire, toi tu supprime tout les espaces. Ensuite, elle doit retourner le nombre d'espace dans la nouvelle chaine, pas la nouvelle chaine.
pour strcpy va voir la:
http://www.manpagez.com/missing.php
J'ai inverser la source et la destination.
Enfin bref. Dit moi ce qui ne va pas dans ma fonction.
JE veux bien AIDER pas faire le travail à ta place.
la solution de mamiemando est fausse. si s est un char, il n'existe pas s.size().
Ensuite mamiemando, tu ne répond pas aux exigence de l'enoncer, au point de vue du prototype de fonction, et de ce qu'elle fait.
La fonction ne supprime que les espaces supplémentaire, toi tu supprime tout les espaces. Ensuite, elle doit retourner le nombre d'espace dans la nouvelle chaine, pas la nouvelle chaine.
pour strcpy va voir la:
http://www.manpagez.com/missing.php
J'ai inverser la source et la destination.
Enfin bref. Dit moi ce qui ne va pas dans ma fonction.
Pour le s.size() il fallait en effet mettre strlen(s).
Et en effet j'avais mal lu l'énoncé. Ceci dit depuis le début j'ai donné des codes qui faisaient ça.
Pour ce qui est de ta fonction char sniper il serait plus logique d'utiliser l'opérateur && (car & s'utilise pour les masques).
Pour corriger ce que j'ai dit je propose :
Keep cool char sniper ;-)
Et en effet j'avais mal lu l'énoncé. Ceci dit depuis le début j'ai donné des codes qui faisaient ça.
Pour ce qui est de ta fonction char sniper il serait plus logique d'utiliser l'opérateur && (car & s'utilise pour les masques).
Pour corriger ce que j'ai dit je propose :
char * suppr_espace(const char *s){ char *res=(char *)calloc(strlen(s)+1); unsigned int j=0; short int premier_espace_traite=0; //pour chaque caractère for(unsigned int i=0;i<strlen(s);++i){ //si c'est pas un espace ou le premier espace //on le recopie dans la chaine resultat if(!isspace(s[i]) && !premier_espace_traite){ res[j]=s[i]; ++j; } //si le caractère traite est un espace if(isspace(s[i])){ premier_espace_traite=1; }else{ premier_espace_traite=0; } } return res; }
Keep cool char sniper ;-)
salut
Voila, une fonctionne qu'elle est belle !
reste plus qu'a retourner le nombre d'espace à la fin, et à modifier s. Mais je ne voi plus de problèmes.
Donc, Angelica, te voila avec deux fonctions qui doivent tourné.
Bonne chance pour la suite
Voila, une fonctionne qu'elle est belle !
reste plus qu'a retourner le nombre d'espace à la fin, et à modifier s. Mais je ne voi plus de problèmes.
Donc, Angelica, te voila avec deux fonctions qui doivent tourné.
Bonne chance pour la suite
Char Snipeur,
Je sais ce que fait le strcpy et je sais comment l'utiliser aussi (on vient de le voir en classe). Mais j'ai essayé plusieurs fois de recorriger ta fonction mais elle ne fonctionne pas, car ça donne le même résultat que ma fonction (c'est ça qui va s'afficher) :
Voici la chaine de caracteres que vous avez entre : ÿÿÿÿÿÿÿÿ
Votre nouvelle chaine devient : ÿÿÿÿÿÿÿÿ
Le nombre de caracteres espace restant est : 0
Alors là je ne sais plus si l'erreur est dans la fonction ou dans le main(){ ...
Mamiemando,
Ta fonction semble tellement compliquée pour moi, mais je ne t'en veux pas parce que tu m'as aidé, mais c'est moi qui n'est pas à la hauteur de comprendre. Je ne sais pas ce que fais calloc, les étoiles * , ... Celle de Char Snipeur est plus à ma hauteur, je la comprends mieux car ça ressemble à ce que j'ai fait, mais comme tu peux le lire, le résultat affiché à l'écran est bizarre...
Je sais ce que fait le strcpy et je sais comment l'utiliser aussi (on vient de le voir en classe). Mais j'ai essayé plusieurs fois de recorriger ta fonction mais elle ne fonctionne pas, car ça donne le même résultat que ma fonction (c'est ça qui va s'afficher) :
Voici la chaine de caracteres que vous avez entre : ÿÿÿÿÿÿÿÿ
Votre nouvelle chaine devient : ÿÿÿÿÿÿÿÿ
Le nombre de caracteres espace restant est : 0
Alors là je ne sais plus si l'erreur est dans la fonction ou dans le main(){ ...
Mamiemando,
Ta fonction semble tellement compliquée pour moi, mais je ne t'en veux pas parce que tu m'as aidé, mais c'est moi qui n'est pas à la hauteur de comprendre. Je ne sais pas ce que fais calloc, les étoiles * , ... Celle de Char Snipeur est plus à ma hauteur, je la comprends mieux car ça ressemble à ce que j'ai fait, mais comme tu peux le lire, le résultat affiché à l'écran est bizarre...
Voici ce que j'ai corriger de ta fonction Char Snipeur en incluant le main(){ aussi (comme preuve que je travaille aussi) :
#include <iostream>
#include <string>
int supprimer_espace_en_plus (char chaine[]){
char temporaire [strlen(chaine)] ;
int compteur = 0 ;
int j = 0 ;
for (int i=0 ; i<strlen(chaine)-1 ; i++) {
if ( (chaine[i]==' ') && (chaine[i+1]!=' ') ) {
compteur++ ;
}
if ( (chaine[i]==' ') && (chaine[i+1]==' ') ) {
continue ;
}
temporaire[j]=chaine[i];
j++ ;
}
temporaire[j] = chaine[strlen(chaine)-1] ;
temporaire[j+1] = '\0' ;
strcpy(chaine , temporaire) ;
return compteur ;
}
main () {
char chaine[100] ;
int compteur ;
printf("Entrer une chaine de caractere : \n") ;
std::string chaines;
getline(std::cin,chaines);
printf("Voici la chaine de caracteres que vous avez entre : %s\n",chaine);
compteur = supprimer_espace_en_plus (chaine) ;
printf("Votre nouvelle chaine devient : %s\n",chaine);
printf("Le nombre de caracteres espace restant est : %d\n",compteur);
return 0 ;
}
L'erreur est toujours la même dans le résultat affiché à l'écran...
#include <iostream>
#include <string>
int supprimer_espace_en_plus (char chaine[]){
char temporaire [strlen(chaine)] ;
int compteur = 0 ;
int j = 0 ;
for (int i=0 ; i<strlen(chaine)-1 ; i++) {
if ( (chaine[i]==' ') && (chaine[i+1]!=' ') ) {
compteur++ ;
}
if ( (chaine[i]==' ') && (chaine[i+1]==' ') ) {
continue ;
}
temporaire[j]=chaine[i];
j++ ;
}
temporaire[j] = chaine[strlen(chaine)-1] ;
temporaire[j+1] = '\0' ;
strcpy(chaine , temporaire) ;
return compteur ;
}
main () {
char chaine[100] ;
int compteur ;
printf("Entrer une chaine de caractere : \n") ;
std::string chaines;
getline(std::cin,chaines);
printf("Voici la chaine de caracteres que vous avez entre : %s\n",chaine);
compteur = supprimer_espace_en_plus (chaine) ;
printf("Votre nouvelle chaine devient : %s\n",chaine);
printf("Le nombre de caracteres espace restant est : %d\n",compteur);
return 0 ;
}
L'erreur est toujours la même dans le résultat affiché à l'écran...
Salut.
Comme je voi que tu as travaillé, et que j'avais un peu de temps, j'ai pris 5min pour débugger ton prog.
Il est évident qu'il ne pouvai fonctionner !
En effet, tu lis la chaine de caractère et tu la met dans chaines (avec un 's') mais tu passe chaine (sans 's') qui n'est pas modifier à la fonction. Donc, tu te retrouve avec n'importe quioi
je te join le code corriger en vitesse (à toi de continuer un peu pour améliorer)
Comme je voi que tu as travaillé, et que j'avais un peu de temps, j'ai pris 5min pour débugger ton prog.
Il est évident qu'il ne pouvai fonctionner !
En effet, tu lis la chaine de caractère et tu la met dans chaines (avec un 's') mais tu passe chaine (sans 's') qui n'est pas modifier à la fonction. Donc, tu te retrouve avec n'importe quioi
je te join le code corriger en vitesse (à toi de continuer un peu pour améliorer)
#include <iostream> #include <string> int supprimer_espace_en_plus (char chaine[]){ char temporaire [strlen(chaine)] ; int compteur = 0 ; int j = 0 ; for (int i=0 ; i<strlen(chaine)-1 ; i++) { if ( (chaine[i]==' ') && (chaine[i+1]!=' ') ) { compteur++ ; } if ( (chaine[i]==' ') && (chaine[i+1]==' ') ) { continue ; } temporaire[j]=chaine[i]; j++ ; } temporaire[j] = chaine[strlen(chaine)-1] ; temporaire[j+1] = '\0' ; strcpy(chaine , temporaire) ; return compteur ; } main () { char chaine[100] ; int compteur ; printf("Entrer une chaine de caractere : \n") ; std::string chaines; getline(std::cin,chaines); printf("Voici la chaine de caracteres que vous avez entre : %s\n",chaines.c_str()); strcpy(chaine,chaines.c_str()); compteur = supprimer_espace_en_plus (chaine) ; printf("Votre nouvelle chaine devient : %s\n",chaine); printf("Le nombre de caracteres espace restant est : %d\n",compteur); system("pause"); return 0 ; }