Les étapes pour supprimer le caractère de nouvelle ligne de la manière peut-être la plus évidente:
- Déterminez la longueur de la chaîne à l'intérieur
NAME
en utilisant strlen()
, header string.h
. Notez que strlen()
cela ne compte pas la terminaison \0
.
size_t sl = strlen(NAME);
- Vérifiez si la chaîne commence par ou ne comprend qu'un seul
\0
caractère (chaîne vide). Dans ce cas sl
, 0
car strlen()
comme je l'ai dit ci-dessus ne compte pas le \0
et s'arrête à sa première occurrence:
if(sl == 0)
{
// Skip the newline replacement process.
}
- Vérifiez si le dernier caractère de la chaîne appropriée est un caractère de nouvelle ligne
'\n'
. Si tel est le cas, remplacez-le \n
par un \0
. Notez que le nombre d'index commence à 0
donc nous devrons faire NAME[sl - 1]
:
if(NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
Notez que si vous avez uniquement appuyé sur Entrée à la fgets()
demande de chaîne (le contenu de la chaîne était uniquement composé d'un caractère de nouvelle ligne), la chaîne en NAME
sera une chaîne vide par la suite.
- Nous pouvons combiner les étapes 2. et 3. ensemble en une seule
if
déclaration en utilisant l'opérateur logique &&
:
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
- Le code fini:
size_t sl = strlen(NAME);
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
Si vous aimez plutôt une fonction pour utiliser cette technique en gérant fgets
les chaînes de sortie en général sans retaper à chaque fois, voici fgets_newline_kill
:
void fgets_newline_kill(char a[])
{
size_t sl = strlen(a);
if(sl > 0 && a[sl - 1] == '\n')
{
a[sl - 1] = '\0';
}
}
Dans votre exemple fourni, ce serait:
printf("Enter your Name: ");
if (fgets(Name, sizeof Name, stdin) == NULL) {
fprintf(stderr, "Error reading Name.\n");
exit(1);
}
else {
fgets_newline_kill(NAME);
}
Notez que cette méthode ne fonctionne pas si la chaîne d'entrée contient des \0
s incorporés . Si tel était le cas strlen()
, le nombre de caractères ne serait renvoyé que jusqu'au premier \0
. Mais ce n'est pas une approche assez courante, car la plupart des fonctions de lecture de chaîne s'arrêtent généralement au premier \0
et prennent la chaîne jusqu'à ce caractère nul.
Mis à part la question seule. Essayez d'éviter la double négations qui font votre code unclearer: if (!(fgets(Name, sizeof Name, stdin) != NULL) {}
. Vous pouvez simplement le faire if (fgets(Name, sizeof Name, stdin) == NULL) {}
.
if (!fgets(Name, sizeof Name, stdin))
(à tout le moins, n'utilisez pas deux négations,! et! =)