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

标签 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]);
        }
}

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

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

谢谢

最佳答案

简短的回答是:你不能。

如果您想读取字符串 (%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);

}

关于c - 如何在 C 中检查用户输入的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7880141/

相关文章:

c - 奇怪的字符保存在我的文本文件中

python - python struct 模块中的转换是如何完成的?

c - 如何让日文字符显示

c - 功能和程序分离

c++ - 编译器如何解析结构成员的地址?

ruby-on-rails - 具有多个序列化器 rails 的序列化器中的数组

python - 如何在 tensorflow 中将图像张量转换为numpy数组?

php - 在 PHP/MySQL DB 中存储和检索数组的最佳方法是什么

javascript - html 输入显示不同的文本到它发布的值

输入文本的CSS输入字段文本颜色