c - 为什么此函数中使用 Char 数据类型?

标签 c scanf

我是一名学生,我们的老师给了我这个功能来获取用户输入。它用于整数,但我很困惑为什么会有 char 数据类型。如果有人可以解释这个功能,那就太好了。

#pragma warning (disable: 4996)
int getNum(void)
{
    char record[121] = {0};
    int number = 0;
    fgets(record, 121, stdin);
    if( sscanf(record, "%d", &number) != 1)
    {
        number = -1;
    }
    return number;
}

例如,调用时我们这样做:

    int age = 0;      //we always have to initialize
    age = getNum();   //this is how we call the function to get user input

最佳答案

char record[121] 变量实际上是字符的数组,也称为字符串。在这里使用它是为了如果给出了错误的输入(而不是有效的 integer 输入),那么输入流仍然会被 fgets() 调用清除,它接收 所有 个字符,直到(包括)换行符。

然后 sscanf 函数尝试从读取的字符串中提取有效整数,如果失败,则将错误值 (-1) 分配给信号那个事实。如果成功,它会将给定的输入值分配给 number,就像 成功 调用 scanf("%d", &number) 会。

但是,仅使用这样一个简单的 scanf() 调用可能会在输入流中留下“未处理的”字符,这可能会导致任何后续输入操作出现问题(或要求输入流是已清除)。


使用这种技术还可以防止用户在有效输入后键入额外 字符而导致的不良/意外效果。例如,如果您输入 1a 以响应第一个提示,以下(故意糟糕的)代码将引起“意外”:

#include <stdio.h>

int main()
{
    int number = 0, number2 = 0;
    printf("Enter first number: ");
    scanf("%d", &number);
    printf("Enter second number: ");
    scanf("%d", &number2);
    printf("Given numbers were: %d and %d.\n", number, number2);
    return 0;
}

但是,使用您老师提供的 getNum() 函数,以下代码更加健壮:

int main()
{
    int number = 0, number2 = 0;
    printf("Enter first number: ");
    number = getNum();
    printf("Enter second number: ");
    number2 = getNum();
    printf("Given numbers were: %d and %d.\n", number, number2);
    return 0;
}

关于c - 为什么此函数中使用 Char 数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64701442/

相关文章:

c - C 中的函数不返回正确的指针类型?

c++ - header 背后的基本原理是什么?

c - 发送结构数组时程序崩溃

c - 如何让 scanf 继续使用空扫描集

c - 如何更改作为参数传递的变量的值?

c - C语言中的标识符存放在哪里

python - 为什么我的 scanf 捕捉到我从 Popen 发出的命令

c - 如何使用 while 循环扫描数字和运算符系列?

c - fork后如何通过键盘在子进程中引入字符串

c - 通过函数时获取垃圾而不是变量