如何检查C中用户输入的长度?

Kri*_*ris 2 c arrays input scanf

我对C有点陌生,输入的输入确实使我感到困惑。我正在尝试初始化大小为4的数组,但有时用户会输入3的有效输入。在Java中,我可以检查输入的长度并添加条件,但不确定在C中如何工作。

main(void){
        char str[N];
        int i;

        for(i = 0; i < N; i++){
                scanf("%c", &str[i]);
        }

        for(i = 0; i < N; i++){
            printf("%c\n", str[i]);
        }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我输入4或更多,它可以正常工作。如果我输入3,它将中断。我希望它能处理3个或4个字符。

实际上,问题的根源是:我试图在C中找到一种方法来读取24小时制的时间,并将其添加到24小时制的时间中。我应该以一种完全不同的方式来处理吗?

谢谢,

nin*_*alj 6

scanf()允许使用最大宽度说明符:

因此scanf("%3s", buffer)最多读取 3 个字符 + 1 个 NUL 终止符。


Bri*_*ach 5

简短的答案是:您不能。

scanf()因此,如果要读取字符串(%s),使用该方法特别危险。如果用户输入的内容超出缓冲区可以容纳的范围,那么您的缓冲区就会溢出。

fgets() 另一方面,允许您指定要读取的最大字节数,以防止缓冲区溢出。

这是一个简单的示例,说明如何为某些输入编写函数,以验证输入是否在指定的长度内并且是完整行(以\n- 结尾的此例程\n从输入中舍弃该输入):

void getInput(char *question, char *inputBuffer, int bufferLength)
{
    printf("%s  (Max %d characters)\n", question, bufferLength - 1);
    fgets(inputBuffer, bufferLength, stdin);

    if (inputBuffer[strlen(inputBuffer) -1] != '\n')
    {
        int dropped = 0;
        while (fgetc(stdin) != '\n')
            dropped++;

        if (dropped > 0) // if they input exactly (bufferLength - 1) 
                         // characters, there's only the \n to chop off
        {
            printf("Woah there partner, your input was over the limit by %d characters, try again!\n", dropped );
            getInput(question, inputBuffer, bufferLength);
        }
    }
    else
    {
        inputBuffer[strlen(inputBuffer) -1] = '\0';      
    }
}

int main()
{
    char firstAnswer[10];
    getInput("Go ahead and enter some stuff:", firstAnswer, 10);
    printf("Okay, I got: %s\n",firstAnswer);

}
Run Code Online (Sandbox Code Playgroud)