【问题标题】:How do I check length of user input in C?如何检查 C 中用户输入的长度?
【发布时间】:2011-12-14 08:58:47
【问题描述】:

我对 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 小时制的持续时间中。我应该以完全不同的方式来解决这个问题吗?

谢谢,

【问题讨论】:

    标签: c arrays input scanf


    【解决方案1】:

    简短的回答是:你不能。

    使用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);
    
    }
    

    【讨论】:

    • for(i = 0; i &lt; N; i++) 不保证不会溢出吗?
    • @sidyll:确实如此,但它可能会尝试读取太多,因此字段宽度说明符更好。
    • 为清楚起见进行了编辑-我的意思是阅读字符串。他一次读取一个字符的问题是他不知道输入长度,而且他没有处理缓冲区填充不足的问题。他可以将 char 数组初始化为所有 '\0' 并在每次读取时添加对 \n 的检查,但恕我直言,最好使用 fgets 并简单地完成它。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 2018-11-06
      • 1970-01-01
      • 2017-10-05
      • 2012-08-23
      • 1970-01-01
      相关资源
      最近更新 更多