Шаги по удалению символа новой строки, возможно, наиболее очевидным способом:
- Определите длину строки внутри
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);
}
Обратите внимание, что этот метод не работает, если во входную строку встроены \0s. В этом случае strlen()будет возвращаться только количество символов до первого \0. Но это не совсем обычный подход, так как большинство функций чтения строк обычно останавливаются на первом \0и принимают строку до этого нулевого символа.
Помимо вопроса сам по себе. Старайтесь избегать двойных отрицаний , которые делают ваш код unclearer: if (!(fgets(Name, sizeof Name, stdin) != NULL) {}. Вы можете просто сделать if (fgets(Name, sizeof Name, stdin) == NULL) {}.
if (!fgets(Name, sizeof Name, stdin))(по крайней мере, не используйте два отрицания,! и! =)