Supprimer des points dans une chaîne en C

Je crée un petit programme en C dans lequel je mettrais quelques chiffres et points, puis supprimerais tous les points (.).

Je pensais à un whileloop mais je n’arrive pas à comprendre ce que je devrais faire ensuite. Jusqu’ici j’ai eu ceci:

#include  #include  #include  int main(int argc, char *argv[]) { char s[30]; int k=0; printf("Enter your account number including dots. \n"); gets(s); printf("Account number without dots:"); while (s[k]!=0) { //????? } return 0; 

Suis-je sur la bonne voie ou dois-je commencer différemment sans utiliser une boucle while? Je ne peux trouver des solutions que s’il existe une chaîne spécifique qui n’est pas écrite par l’utilisateur, mais par le programmeur …

Mettez un IF pour n’imprimer que des caractères qui ne sont pas des points. Comme le suggèrent les autres, vous devriez probablement changer les options d’access aux objects.

 #include  #include  #include  int main(int argc, char *argv[]) { char s[30]; int k=0; printf("Enter your account number including dots. \n"); gets(s); printf("Account number without dots:"); while (s[k]!=0) { if ( s[k] != '.' ) { printf("%c", s[k]); } k++; } printf("\n"); return 0; } 

Avec une boucle while, je crains également que si l’utilisateur introduit 30 caractères au maximum, vous n’atteindrez pas votre condition de sortie. Pour éviter ce problème, une boucle for serait préférable (puisque vous connaissez déjà la taille du tableau). Toutefois, si vous procédez ainsi, vous devrez également initialiser votre tableau “s” pour qu’il soit vide.

 #include  #include  #include  int main(int argc, char *argv[]) { char s[30]; int k=0; printf("Enter your account number including dots. \n"); gets(s); printf("Account number without dots:"); for ( k = 0 ; k < 30 ; k++ ) { if ( s[k] != '.' && s[k] != 0 ) { printf("%c", s[k]); } k++; } printf("\n"); return 0; } 
 #include  #include  #include  int main(int argc, char *argv[]) { char s[30]; int k=0; printf("Enter your account number including dots. \n"); gets(s); printf("Account number without dots:"); while (s[k]!=0) { if(s[k] == '.') s[k] = s[k + 1]; k++; } s[k] = '\0'; return 0; 
 #include  //remove the specified character from str char *strrmc(char *str, char ch){ char *from, *to; from = to = str; while(*from){ if(*from == ch) ++from; else *to++ = *from++; } *to = '\0'; return str; } int main(int argc, char *argv[]){ char s[30] = "192.169.007"; printf("%s\n", strrmc(s, '.'));//192169007 return 0; } 

Voici une façon de procéder: elle est différente de la façon dont vous avez commencé, mais peut être facilement modifiée. Cela pourrait également être amélioré, mais nous pourrons en discuter dans de plus amples commentaires. 🙂

 #include  #include  #include  int main(int argc, char *argv[]) { /* Take account number in as argument to executable */ int dotless_length = 30; char dotless[dotless_length]; int k = 0; int i = 0; while (argv[1][k] != '\0' && i < dotless_length) { if (argv[1][k] >= 48 && argv[1][k] <= 57) { /* ascii decimal codes for 0-9 */ dotless[i] = argv[1][k]; i++; } else if (argv[1][k] != '.') { printf("invalid input: %c\n", argv[1][k]); return 1; } k++; } dotless[i] = '\0'; /* null-terminate it! */ printf("Account number without dots: %s\n", dotless); return 0; } 

Puis comstackz avec gcc -Wall -o zdotless filename.c et exécutez-le avec

./zdotless 401.863.3000 titre d'exemple.

Remarques : Cela peut sembler plus difficile, car il entre un peu plus dans l’assainissement des entrées (et dans la propreté) que votre original - par exemple

  1. en ne supposant pas que la saisie de l'utilisateur se compose uniquement de chiffres et de périodes,
  2. enregistrer la chaîne résultante sans points (pour de futures manipulations présumables?),
  3. avoir un endroit pour changer la longueur de dotless (un pas en avant pour ne pas le coder en dur), et
  4. ne pas être interactif.

Lorsque vous appelez un exécutable, argv correspond à ce que vous avez saisi. Ainsi, argv[0] est le nom de l’exécutable ( ./zdotless ), argv[1] est l’argument suivant ( 401.863.3000 sous forme de chaîne), et ainsi de suite si il y a plus d'arguments. Puisque argv[1] est la représentation sous forme de chaîne de votre numéro d'entrée en points, argv[1][0] est le premier caractère, etc.

Étant donné que nous copions dotless caractère dotless par caractère plutôt que de manipuler des chaînes, vous devez vous attacher manuellement à un caractère nul. (Ce même caractère nul correspond à ce que vous bouclez jusqu'à atteindre, lors de la lecture initiale de la chaîne d'entrée.) Autres questions? ...