Крок для видалення символу нового рядка, можливо, найбільш очевидним способом:
- Визначте довжину рядка всередині
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))
(принаймні, не використовуйте два заперечення! і! =)