Шаги по удалению символа новой строки, возможно, наиболее очевидным способом:
- Определите длину строки внутри
NAME
, используя strlen()
заголовок string.h
. Обратите внимание, что strlen()
не считается окончание \0
.
size_t sl = strlen(NAME);
- Посмотрите, начинается ли строка с или содержит только один
\0
символ (пустая строка). В этом случае sl
будет, 0
поскольку, strlen()
как я сказал выше, не учитывается \0
и останавливается при первом появлении этого:
if(sl == 0)
{
// Skip the newline replacement process.
}
- Проверьте, является ли последний символ правильной строки символом новой строки
'\n'
. Если это так, замените \n
на \0
. Обратите внимание, что индекс начинается с 0
того, что нам нужно сделать NAME[sl - 1]
:
if(NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
Обратите внимание, что если вы только нажали Enter при fgets()
запросе строки (содержимое строки состояло только из символа новой строки), строка NAME
после будет пустой строкой.
- Мы можем объединить шаги 2. и 3. вместе в одном
if
выражении, используя логический оператор &&
:
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
- Готовый код:
size_t sl = strlen(NAME);
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
Если вы предпочитаете функцию для использования этой техники, обрабатывая fgets
выходные строки в целом, не перепечатывая каждый раз, вот 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';
}
}
В приведенном вами примере это будет:
printf("Enter your Name: ");
if (fgets(Name, sizeof Name, stdin) == NULL) {
fprintf(stderr, "Error reading Name.\n");
exit(1);
}
else {
fgets_newline_kill(NAME);
}
Обратите внимание, что этот метод не работает, если во входную строку встроены \0
s. В этом случае strlen()
будет возвращаться только количество символов до первого \0
. Но это не совсем обычный подход, так как большинство функций чтения строк обычно останавливаются на первом \0
и принимают строку до этого нулевого символа.
Помимо вопроса сам по себе. Старайтесь избегать двойных отрицаний , которые делают ваш код unclearer: if (!(fgets(Name, sizeof Name, stdin) != NULL) {}
. Вы можете просто сделать if (fgets(Name, sizeof Name, stdin) == NULL) {}
.
if (!fgets(Name, sizeof Name, stdin))
(по крайней мере, не используйте два отрицания,! и! =)