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

3
我有点新手学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]);
        }
}

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

实际上,问题的根源是:我正在尝试用C语言找到一种读取24小时制时间并将其加到24小时持续时间的方法。我是否应该采用完全不同的方法来解决这个问题?

谢谢,

2个回答

7
短而直接的答案是:你不能这样做。
如果要读入字符串(使用%s),则使用scanf()特别危险,因为如果用户输入超过缓冲区大小,就会发生缓冲区溢出错误。相反,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);

}

for(i = 0; i < N; i++) 这个循环语句不保证不会发生溢出吗? - sidyll
@sidyll: 它可以,但是它可能会尝试读取太多的内容,所以最好使用字段宽度说明符。 - ninjalj
编辑以更清晰 - 我的意思是读入一个字符串。他每次只读入一个字符的问题在于他不知道输入长度,而且他没有处理缓冲区未填充的情况。他可以将char数组初始化为所有的'\0',并在每次读取时添加对\n的检查,但在我看来,最好使用fgets并简单地完成它。 - Brian Roach

6

scanf() 允许使用最大宽度限定符:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接