Я знаю, что все сказали мне использовать fgets и не добираются из-за переполнения буфера. Однако я немного смущен третьим параметром в fgets()
. Насколько я понимаю fgets зависит от:
char * fgets ( char * str, int num, FILE * stream );
char* str
ptr туда, где мой вход будет сохранен.
num
макс. количество символа, который будет считан.
но что FILE *stream
? Если я просто предлагаю пользователю входить, строка (как предложение) должна я просто ввести"stdin
" ?
И если я ввожу FILE *stdin
наверху, рядом main()
?
Вы правы. stream
- это указатель на структуру FILE
, подобную той, что возвращается из fopen
. stdin
, stdout
и stderr
уже определены для Вашей программы, поэтому Вы можете использовать их непосредственно вместо того, чтобы открывать или объявлять их самостоятельно.
Например, Вы можете читать со стандартного входа с:
fgets(buffer, 10, stdin);
или из определенного файла с:
FILE *f = fopen("filename.txt", "r");
fgets(buffer, 10, f);
FILE - это стандартный C-файл. Да, если Вы хотите читать со стандартного входа, stdin является правильным символом.
. В широком смысле, существует два способа связи с файлами на языке C. Первый - это использование системных вызовов, зависящих от операционной системы низкого уровня, таких как open()
, read()
, write()
и т.д., которые работают с файловыми дескрипторами. Другая использует структуры FILE
, которые используются в библиотечных функциях Си, таких как fread()
, fwrite()
и т.д., включая ту, которую вы упомянули выше.
Как и в UNIX-философии, все является файлом. Поэтому даже стандартный вход (stdin
) рассматривается как указатель на структуру FILE
.
tl;dr Да, вы должны использовать stdin
для FILE* потока
в вашем вызове на fgets()
Да, просто используйте stdin
. Это предопределенный FILE *
, который считывается со стандартного входа Вашей программы. И она уже должна быть определена, если у Вас есть #include
в верхней части файла (который Вам понадобится для fgets
).