Problème-Programmation C++

Résolu/Fermé
Angelica - 4 avril 2006 à 06:23
 Angelica - 10 avril 2006 à 00:42
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!!!
A voir également:

17 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
4 avril 2006 à 11:26
#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
0
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?
0
mamiemando Messages postés 33284 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 25 septembre 2024 7 787
5 avril 2006 à 01:10
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
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
0
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! ^_^
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33284 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 25 septembre 2024 7 787
5 avril 2006 à 09:13
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
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
5 avril 2006 à 12:49
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.
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.
0
Ici, tmp[] est un autre tableau de caractères ayant la même taille que s[] , n'est-ce pas?
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
5 avril 2006 à 17:30
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.
0
Quelqu'un d'autre est intéressé à m'aider??? SVP!!!
=(
0
mamiemando Messages postés 33284 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 25 septembre 2024 7 787
6 avril 2006 à 19:07
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
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
6 avril 2006 à 22:47
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.
0
mamiemando Messages postés 33284 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 25 septembre 2024 7 787
6 avril 2006 à 23:17
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 :
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 ;-)
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
7 avril 2006 à 09:50
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
0
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...
0
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...
0
Est-ce qu'il y a quelqu'un?
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
10 avril 2006 à 00:02
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)
#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 ;
}
0
Char Snipeur,
Je te remercie beaucoup beaucoup beaucoup!
^_^
0