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