2011-09-04 5 views
-1

La fonction ci-dessous doit être remplacer les caractères trouvés dans s avec des espaces si elles se trouvent dans toBlank:c - la comparaison des chaînes

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

/* function blank replaces all characters in the parameter string s 
* that are present in the parameter string toBlank with space characters. 
* for example, if s were the string "abcdef" and toBlank the string 
* "bde", then after calling this function, s would be "a c f" */ 
void blank(char *s, const char *toBlank){ 
    int i=0, j=0; 
    while (s[i] != '\0'){ 
     if (s[i] == toBlank[j]){ 
      s[i] = ' '; 
     }else{ 
      j++; 
     } 
     i++; 

    } 
    printf("%s", s); 
} 

int main(void){ 
    blank("abcdef", "bde"); 
} 

Le problème est, s est de ne jamais être modifiés. Quelqu'un peut-il expliquer ce qui se passe?

+3

S'il vous plaît décrire plus en détail « ne fonctionne pas » (en éditant votre question), et choisir un meilleur titre - ce qui est de remplacer les choses dans une chaîne, pas la comparaison des chaînes . – Mat

Répondre

6

Vous passez un littéral de chaîne (qui est effectivement const) comme premier paramètre, et vous essayez ensuite de le modifier dans la fonction.

Pour ce faire, à la place:

int main(void) 
{ 
    char s[] = "abcdef"; 

    blank(s, "bde"); 

    return 0; 
} 
3

Je pense que vous devez itérer sur les personnages toBlank. Ne voulez-vous pas le j ++ à l'intérieur du si et non l'autre

void blank(char *s, const char *toBlank) 
{ 
    int i=0, j; 
    while (s[i] != '\0') 
    { 
     j = 0; 
     while(toBlank[j] != '\0') 
     { 
      if (s[i] == toBlank[j]) 
      { 
       s[i] = ' '; 
       break; 
      } 
      else 
      { 
       ++j; 
      } 
     } 
     ++i; 
    } 
    printf("%s", s); 
} 
+0

Vous devez également réinitialiser j pour chaque i. – quasiverse

+0

@quasiverse Bonne prise. J'ai changé en conséquence. – tgoodhart

+0

+1: Votre diagnostic de 'mauvaises conditions de boucle' est exact. La boucle interne peut être réduite à: 'for (int j = 0; àBlank [j]! = '\ 0'; j ++) {if (s [i] == àBlank [j]) {s [i] = ' '; Pause; }} 'qui est 8 lignes maximum par rapport à 13 dans votre réponse. Il pourrait aussi être changé en: 'if (strchr (toBlank, s [i])! = 0) s [i] = '';' pour une sauvegarde plus spectaculaire. En effet, le corps entier de la fonction pourrait être: 'pour (int i = 0; s [i]! = '\ 0'; i ++) {if (strchr (àBlank, s [i])! = 0) s [ i] = ''; } printf ("% s \ n", s); 'pour 6 lignes au total. –

0

Je pensais que vous progressez lorsque vous trouvez l'omble chevalier

1
/* there are stdlib functions for these kind of things */ 

#include <stdlib.h> 
void blank(char *str, char * wits) 
{ 
size_t pos,len; 

for (pos=len=0; str[pos]; pos += len) { 
    len = strspn(str+pos, wits); 
    if (len) memset(str+pos, ' ', len); 
    else len = strcspn(str+pos, wits); 
    } 
}