как получить размер ввода с помощью fgets?

#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 .