Я смущен. В Интернете вы можете увидеть разные ответы, так каков же настоящий ответ? Спасибо.
Что будет храниться в имени? Предположим, что пользователь вводит следующее:
ДженниENTER
20ВВОД
void function()
{
int product;
char name[10];
fgets(name, 10, stdin);
scanf("%d", &product);
}
А. Дженни\0
Б. Дженни\n\0
Урок: не экономьте на размере буфера! Эмпирическое правило, когда вы не используете микроконтроллер, возьмите самый длинный ожидаемый ввод и удвойте его для размера буфера. Для обычного линейного ввода подойдет буфер 1K или 2K. Имена 128 байт, как правило, подходят и т. д. name[strcspn (name, "\n")] = 0;
обрезает '\n'
с конца.
Когда ввод достаточно короткий, чтобы поместиться, будет включена новая строка.
Если данные перед новой строкой составляют 9 или более символов (для приведенного выше кода), новая строка не будет включена, а дополнительные символы и новая строка останутся во входном потоке для чтения другим входным вызовом. Если вы введете Jenny
(и новую строку), новая строка будет включена. Если вы введете Jennifer
, вы также получите новую строку, но если вы введете Stephanie
и новую строку, вы не получите новую строку (она останется для чтения другой функцией ввода). Если вы введете Antidisestablishmentarianism
, вы получите входную строку Antidises\0
, а tablishmentarianism
останется для чтения другим входным кодом.
Потрясающее объяснение. Спасибо!
Посмотрите эту небольшую программу.
При запуске давайте входные данные длиной больше 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 =
Когда ввод достаточно короткий, чтобы поместиться, будет включена новая строка. Если данные перед новой строкой составляют 9 или более символов (для приведенного выше кода), новая строка не будет включена, а дополнительные символы и новая строка останутся во входном потоке для чтения другим входным вызовом. Если вы введете
Jenny
(и новую строку), новая строка будет включена. Если вы введетеJennifer
, вы также получите новую строку, но если вы введетеStephanie
и новую строку, вы не получите новую строку.