6 votes

C, en comptant le nombre d'espaces vides.

J'écris une fonction qui remplace les espaces vides par des '-' (<- ce caractère). Je veux finalement renvoyer le nombre de modifications effectuées.

#include <stdio.h>
int replace(char c[])
{
    int i, cnt;
    cnt = 0;
    for (i = 0; c[i] != EOF; i++)
        if (c[i]==' ' || c[i] == '\t' || c[i] == '\n')
        {
            c[i] = '-';
            ++cnt;
        }
    return cnt;
}

main()
{
    char cat[] = "The cat sat";
    int n = replace(cat);
    printf("%d\n", n);
}

Le problème est qu'il change correctement la chaîne en "The-cat-sat" mais pour n, il renvoie la valeur 3, alors qu'il est censé renvoyer 2. Qu'est-ce que j'ai fait de mal ?

1voto

Nik Points 1416

@4386427 a suggéré que ce soit une autre réponse. @wildplasser a déjà fourni la solution, cette réponse explique l'EOF et l'EOF. '\0' .

Vous utiliseriez EOF uniquement lors de la lecture d'un fichier (EOF -> End Of File). Voir este discussion. EOF est utilisé pour indiquer la fin du fichier, et sa valeur dépend du système. En fait, EOF est plutôt une condition qu'une valeur. Vous pouvez trouver d'excellentes explications dans ce fil . Lorsque l'on travaille avec un tableau de chars ou un pointeur de chars, il sera toujours terminé par un signe '\0' et il y en a toujours exactement un. Vous l'utiliserez donc pour sortir de la boucle lors de l'itération dans un tableau/pointeur. C'est un moyen sûr de s'assurer que vous n'accédez pas à une mémoire qui n'est pas allouée.

0voto

wildplasser Points 17900
  • Une chaîne se termine par un 0 (zéro), et non une EOF (donc : le programme de la question va analyser la chaîne de caractères au-delà de le terminal \0 jusqu'à ce qu'il trouve un -1 quelque part au-delà ; mais vous êtes déjà en terre d'UB, ici)
  • [sylistic] l'argument de la fonction pourrait être un pointeur de caractère (un argument de tableau ne peut pas exister en C)
  • [stylistique] une version avec pointeur n'aura pas besoin de la variable 'i'.
  • [Le compte ne peut jamais être négatif : intuitivement, un compteur non signé est préférable. (il pourrait même s'agir d'un size_t (tout comme les autres fonctions de chaîne)
  • [stylistique] a switch(){} peut éviter l'affreux (IMO) || il est également plus facile d'ajouter des cas.

unsigned replace(char *cp){
    unsigned cnt;
    for(cnt = 0; *cp ; cp++) {
        switch (*cp){
        case ' ' : case '\t': case '\n':
                *cp = '-';
                cnt++; 
        default:
                break;
                }
        }
return cnt;
}

0voto

EOF utilisé dans la condition de fin de la boucle for est le problème car vous ne l'utilisez pas pour vérifier la fin du fichier/du flux.

for (i = 0; c[i] != EOF; i++)

EOF n'est pas un caractère, mais un signal indiquant qu'il n'y a plus de caractères disponibles dans le flux.

Si vous essayez de vérifier la fin de ligne, veuillez utiliser

for (i = 0; c[i] != "\0"; i++)

0voto

#include <stdio.h>

int repl(int c);

int main(void){
    int c, nc;
    nc =0;

    while ((c=getchar())!=EOF)
        nc = replc(c);

    printf("replaced: %d times\n", nc);

    return 0;
}

int replc(int c){
    int nc = 0;
    for(; (c = getchar())!=EOF; ++c)
       if (c == ' '){
          putchar('-');
          ++nc;
       } else putchar(c);
    return nc;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X