358 votes

Suppression du caractère de fin de ligne de l'entrée fgets()

j'essaie de récupérer des données de l'utilisateur et de les envoyer à une autre fonction dans gcc. le code est quelque chose comme ceci.

printf("Enter your Name: ");
    if(!(fgets(Name, sizeof Name, stdin) != NULL)) {
        fprintf(stderr, "Error reading Name.\n");
        exit(1);
    }

Cependant, je trouve qu'il a un \n Donc, si je saisis John, le message sera envoyé à John. \n. alors comment faire pour l'enlever \n et envoyer une chaîne appropriée.

31 votes

if (!fgets(Name, sizeof Name, stdin)) (au moins n'utilisez pas deux négations, ! et !=)

8 votes

@Roger Pate "ne pas utiliser deux négations" --> hmmm, si nous creusons profondément "ne pas" et "négation" sont tous les deux négations . ;-). Peut-être que "Utiliser if (fgets(Name, sizeof Name, stdin)) { .

6 votes

@chux, je suis sûr que vous vouliez dire if (fgets(Name, sizeof Name, stdin) == NULL ) {

238voto

Jerry Coffin Points 237758

La façon un peu moche :

char *pos;
if ((pos=strchr(Name, '\n')) != NULL)
    *pos = '\0';

La manière un peu étrange :

strtok(Name, "\n");

Il y en a d'autres, bien sûr.

7 votes

Toute bibliothèque d'exécution C prenant en compte les threads (c'est-à-dire la plupart de celles qui visent une plate-forme multithread), strtok() sera thread safe (il utilisera le stockage local du thread pour l'état 'inter-call'). Cela dit, il est généralement préférable d'utiliser la méthode non standard (mais suffisamment courante) strtok_r() variante.

2 votes

Voir ma réponse pour une variante complètement thread-safe et réentrante, similaire à votre strtok (et elle fonctionne avec des entrées vides). En fait, une bonne façon d'implémenter strtok est d'utiliser strcspn y strspn .

4 votes

Il est important de gérer l'autre cas si vous vous trouvez dans un environnement où il y a un risque de files d'attente trop longues. Tronquer silencieusement l'entrée peut provoquer des bogues très dommageables.

87voto

James Morris Points 2557
size_t ln = strlen(name) - 1;
if (name[ln] == '\n')
    name[ln] = '\0';

0 votes

Je ne trouve pas la solution de JerryCoffin meilleure que celle-ci, car elle n'est pas optimisée ou quelque chose comme ça (puisque les deux recherchent la chaîne char par char), juste qu'elle est moins verbeuse et légèrement boguée à cause du commentaire de @Smi. Je trouve votre solution plus propre :)

9 votes

L'exception sera probablement levée si la chaîne est vide, n'est-ce pas ? Comme un index hors de portée.

0 votes

@EdwardOlamisan je pense que je vais laisser cela comme un exercice pour le lecteur ;-)

12voto

Amitabha Points 337

Direct pour enlever le ' \n ' de la sortie fgets si chaque ligne a ' \n '

line[strlen(line) - 1] = '\0';

Autrement :

void remove_newline_ch(char *line)
{
    int new_line = strlen(line) -1;
    if (line[new_line] == '\n')
        line[new_line] = '\0';
}

1 votes

Notez que ce serait plus sûr à utiliser strnlen au lieu de strlen .

3 votes

Un commentaire à la première réponse de la question liée indique "Notez que strlen(), strcmp() et strdup() sont sûrs. Les alternatives 'n' vous donnent des fonctionnalités supplémentaires."

4 votes

@esker non, il ne le ferait pas. L'insertion d'une n n'augmente pas la sécurité par magie, dans ce cas, elle rendrait même le code plus dangereux. De même, avec strncpy une fonction terriblement dangereuse. L'article dont vous avez donné le lien est un mauvais conseil.

3voto

suresh Points 973
// May be simplest.
sprintf(Name,"%s",Name);

-2voto

draebek Points 97
char name[1024];
unsigned int len;

printf("Enter your name: ");
fflush(stdout);
if (fgets(name, sizeof(name), stdin) == NULL) {
    fprintf(stderr, "error reading name\n");
    exit(1);
}
len = strlen(name);
if (name[len - 1] == '\n')
    name[len - 1] = '\0';

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