#c
Вопрос:
У меня проблема с проверкой размера входной строки с помощью fgets. что я хотел сделать, так это
Если размер ввода больше, чем buf_len, затем установите «больше» в 1 еще 0 .
но я не уверен, как правильно проверить размер ввода.
int read_stdin(char *buf, int buf_len, int *more)
{ // buf = malloc(10), buf_len = 10 , more = 1,
fgets(buf, buf_len, stdin) ;
size_t input_buf_len = strlen(buf);
printf("size of input: %zu n",sizeof(input_buf_len)); // prints 8
printf("buf: %lu n",sizeof(buf)); // prints 8
printf("buf_len:%lu n",sizeof(buf_len)); // prints 4
printf("stdin:%lu n",sizeof(stdin));// prints 8
if (input_buf_len > buf_len)
{
*more = 1;
printf("buf > buf_lenn");
}
*more = 0;
printf("buf < buf_len n");
return sizeof(buf);
}
неважно , насколько велика длина ввода , может быть 1 или 20, все равно выводится то же число, что и комментарий в коде.
Комментарии:
1. Это утверждение if if (input_buf_len > buf_len) не имеет смысла. input_buf_len не может быть больше buf_len из-за этого вызова fgets(buf, buf_len, stdin) ;
2. @VladfromMoscow Я хочу , чтобы «больше» было равно 1, если размер ввода больше размера buf, как это лучше сделать?
3. Почему вы печатаете
sizeof(input_buf_len))
вместо того, чтобы просто печатать стоимостьinput_buf_len
? Очевидно, что размер size_t не изменится в зависимости от входных данных.4. Вы не знаете, содержит ли ввод больше данных, пока
fgets
не вернетсяNULL
. Если буфер после чтения заканчивается символом новой строки иfgets
не возвращаетсяNULL
, вы можете прочитать еще раз и получить больше входных данных. Если он вернулся, и весь буфер заполнен, и он не заканчивается новой строкой, возможно, вы можете прочитать еще раз или по совпадению был достигнут конец ввода. Еслиfeof
возвращаетсяNULL
, вам нужно использоватьfeof
иferror
проверить, нет ли больше ввода или произошла ошибка.
Ответ №1:
fgets()
считывает вводимые пользователем данные и останавливается, когда он считывает символ новой строки. Он возвращается:
- Указатель на строку считывается, если это удастся
NULL
если это не удастся или если он столкнется сEOF
Чтобы получить размер ввода, сначала вы должны заменить n
его нулевым терминатором, а затем вызвать strlen()
. Это происходит потому strlen()
, что останавливается, когда он окружает нулевой терминатор, но не останавливается, когда он сталкивается с новой строкой:
if (!fgets(buf, buf_len, stdin)) {
// fgets failed...
} else {
buf[strcspn(buf, "n")] = '';
size_t input_buf_len = strlen(buf);
printf("Input length: %ld", input_buf_len);
}
Ответ №2:
fgets
Вызов считывает текст до новой строки и включает новую строку в прочитанный текст. Если то, что было прочитано, fgets
не заканчивается символом новой строки, это означает, что в этой строке нужно прочитать больше текста.
Если fgets
возвращает значение NULL, это означает, что оно достигло EOF и что никакие символы не были прочитаны.
Комментарии:
1. Если
fgets
возвращает значение NULL, это означает, что либо EOF был достигнут, либо произошла ошибка. Вы не можете знать, что произошло, не позвонивfeof
илиferror
.