|
|
|
|
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!!!
#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 Salutation ! Char Snipeur |
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 :
|
Pour détecter si un char est un espace, il est préférable d'utiliser la fonction isspace :
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 |
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 !!
|
Salut.
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. Salutation ! Char Snipeur |
Vi, c'est ça.
|
Puisque tu ne veux pas utiliser append et les string, on va laisser le C++ et faire du C...
#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.
|
Pour le s.size() il fallait en effet mettre strlen(s).
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 ;-) |
Char Snipeur,
|
Voici ce que j'ai corriger de ta fonction Char Snipeur en incluant le main(){ aussi (comme preuve que je travaille aussi) :
|
Salut.
#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 ;
}
Salutation !
Char Snipeur |