为什么在这个函数中使用 Char 数据类型?

Joe*_*oey 3 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Adr*_*ica 5

char record[121]变量实际上是一个字符数组,也称为string。在这里使用它是为了,如果给出了错误的输入(而不是有效的整数输入),则输入流仍会被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;
}
Run Code Online (Sandbox Code Playgroud)

但是,使用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;
}
Run Code Online (Sandbox Code Playgroud)