Ограничение символов входной строки

Я пытаюсь написать простой код, в котором пользователь должен ввести строку, но если строка содержит более пяти символов, она должна распечатать ошибку и вернуть -1. Я использовал fgets для получения ввода и strlen для вычисления длины строки.

#include <stdio.h>
#include <strings.h>
#include <stdlib.h>


int main()
  {
    char a[5];
    int length = 0;

    printf("Enter a string to calculate it's length\n");
    fgets(a,5,stdin);

    length = strlen(a)-1; // don't want the '\n' to be counted

    if(length > 5){

        printf("error");
    }
    printf("string length %d\n",length);


       return 0;
 }

Когда я ввожу строку с более чем 5 символами, она не выводит ошибку, а просто выводит, что размер строки равен трем.

Может ли кто-нибудь дать мне подсказку?

Заранее спасибо.


person momonosuke    schedule 04.12.2018    source источник
comment
Во-первых, вам понадобится буфер большего размера.   -  person 500 - Internal Server Error    schedule 04.12.2018
comment
Пожалуйста, прочитайте, например. эту fgets ссылку и узнайте, что означает ее второй аргумент.   -  person Some programmer dude    schedule 04.12.2018
comment
Никогда не используйте крошечный размер буфера, такой как 5. Если пользователь попытается ввести 20-символьную строку, как вы будете читать ее, чтобы вызвать для нее strlen и обнаружить, что ее длина слишком велика?   -  person Steve Summit    schedule 04.12.2018
comment
Если вы прочитали только 5 символов, как вы ожидаете узнать, есть ли еще ожидающие чтения? Получите больший буфер, прочитайте несколько дополнительных символов, а затем проверьте, не больше ли то, что вы читаете, чем должно быть.   -  person Qubit    schedule 04.12.2018
comment
спасибо всем я сделал глупую ошибку. @Someprogrammerdude, второй аргумент был решающим   -  person momonosuke    schedule 04.12.2018


Ответы (2)


fgets(a,5,stdin);

fgets всегда читает символы размера 1.

Чтение останавливается после EOF или новой строки. Таким образом, он читает только 4 символа.

length = strlen(a)-1;   // 4-1 = 3
person Ramya Muralidharan    schedule 04.12.2018
comment
fgets всегда читает символы размера 1, а не в том случае, если он сначала встречает конец строки или EOF. ;-) - person DodgyCodeException; 04.12.2018

Используйте strchr для проверки новой строки. Если во входных данных нет новой строки, читайте символы до тех пор, пока не будет найдена новая строка, чтобы очистить входной буфер, и повторите попытку.

#include <stdio.h>
#include <string.h>

int main( void) {
    char a[7];//five characters, a newline and a zero terminator
    int toolong = 0;

    do {
        if ( toolong) {
            printf ( "too many characters. try again\n");
        }
        toolong = 0;
        printf ( "enter up to five characters.\n");
        if ( fgets ( a, sizeof a, stdin)) {
            while ( ! strchr ( a, '\n')) {//check for newline
                toolong = 1;
                fgets ( a, sizeof a, stdin);//read more characters
            }
        }
        else {
            fprintf ( stderr, "fgets EOF\n");
            return 0;
        }
    } while ( toolong);

    return 0;
}
person xing    schedule 04.12.2018