Сохраняет ли fgets новую строку или просто \0?

Я смущен. В Интернете вы можете увидеть разные ответы, так каков же настоящий ответ? Спасибо.

Что будет храниться в имени? Предположим, что пользователь вводит следующее:

ДженниENTER

20ВВОД

void function()
{
    int product;
    
    char name[10];
    
    fgets(name, 10, stdin);
    
    scanf("%d", &product);  
}

А. Дженни\0

Б. Дженни\n\0

Когда ввод достаточно короткий, чтобы поместиться, будет включена новая строка. Если данные перед новой строкой составляют 9 или более символов (для приведенного выше кода), новая строка не будет включена, а дополнительные символы и новая строка останутся во входном потоке для чтения другим входным вызовом. Если вы введете Jenny (и новую строку), новая строка будет включена. Если вы введете Jennifer, вы также получите новую строку, но если вы введете Stephanie и новую строку, вы не получите новую строку.

Jonathan Leffler 13.12.2020 05:53

Урок: не экономьте на размере буфера! Эмпирическое правило, когда вы не используете микроконтроллер, возьмите самый длинный ожидаемый ввод и удвойте его для размера буфера. Для обычного линейного ввода подойдет буфер 1K или 2K. Имена 128 байт, как правило, подходят и т. д. name[strcspn (name, "\n")] = 0; обрезает '\n' с конца.

David C. Rankin 13.12.2020 05:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Когда ввод достаточно короткий, чтобы поместиться, будет включена новая строка.

Если данные перед новой строкой составляют 9 или более символов (для приведенного выше кода), новая строка не будет включена, а дополнительные символы и новая строка останутся во входном потоке для чтения другим входным вызовом. Если вы введете Jenny (и новую строку), новая строка будет включена. Если вы введете Jennifer, вы также получите новую строку, но если вы введете Stephanie и новую строку, вы не получите новую строку (она останется для чтения другой функцией ввода). Если вы введете Antidisestablishmentarianism, вы получите входную строку Antidises\0, а tablishmentarianism останется для чтения другим входным кодом.

Потрясающее объяснение. Спасибо!

Fred 13.12.2020 06:08

Посмотрите эту небольшую программу.

При запуске давайте входные данные длиной больше 10 и меньше 10.
Вы видите, что новая строка (10)dec будет сохранена перед сохранением \0, если длина ввода меньше 10.

#include <stdio.h>

int main()
{
    char str[10] = {0};
    int i  = 0;
    fgets(str,sizeof(str),stdin);
    
    while(str[i])
    {
        printf("%d %d = %c\n" ,i, str[i], str[i]);
        i++;
    }
    printf("%d %d = %c\n" , i, str[i], str[i]);
    return 0;
}
ABCDEFGHIJKLM                                                                                                         
0 65 = A                                                                                                              
1 66 = B                                                                                                              
2 67 = C                                                                                                              
3 68 = D                                                                                                              
4 69 = E                                                                                                              
5 70 = F                                                                                                              
6 71 = G                                                                                                              
7 72 = H                                                                                                              
8 73 = I                                                                                                              
9 0 = 
HELLO                                                                                                                 
0 72 = H                                                                                                              
1 69 = E                                                                                                              
2 76 = L                                                                                                              
3 76 = L                                                                                                              
4 79 = O                                                                                                              
5 10 =                                                                                                                
                                                                                                                      
6 0 =    

Другие вопросы по теме