如何修复C中scanf()的返回值?

如何修复C中scanf()的返回值?,c,C,我正在为一个编程类编写一些C代码,该类从stdin获取输入。该程序用于检查输入格式,如果输入格式不正确,则终止。我的问题是程序没有读取正确格式的输入 它需要执行的第一个检查是int。如果我错了,请纠正我,但是当您将%d作为参数时,scanf()应该跳过空白,直到它找到int。然后,它应该返回一个int:它接收到的成功输入数。我将此返回值赋值给一个变量,以便检查错误。我的scanf() 我的代码如下: double stddev(double sum, double sum_of_squares,

我正在为一个编程类编写一些C代码,该类从
stdin
获取输入。该程序用于检查输入格式,如果输入格式不正确,则终止。我的问题是程序没有读取正确格式的输入

它需要执行的第一个检查是
int
。如果我错了,请纠正我,但是当您将
%d
作为参数时,
scanf()
应该跳过空白,直到它找到
int
。然后,它应该返回一个
int
:它接收到的成功输入数。我将此
返回值
赋值给一个变量,以便检查错误。我的
scanf()

我的代码如下:

double stddev(double sum, double sum_of_squares, int n){
    double variance, result;

    variance = ((n * sum_of_squares) - pow(sum, 2)) / (n * (n - 1));
    result = sqrt(variance);

    return result;
}

int nextinput() {
    int true = 1;
    int false = 0;
    int current = getchar();

    if (isspace(current)) {
        while (isspace(current = getchar())) {
            if (current == '\n') {
                return false;
            }
        }
    }
    else {
        return false;
    }

    ungetc(current, stdin);
    return true;
}

int main() {
    char current_char;
    int ret, current_int, control;
    int max_char = 0;
    int int_sum = 0;
    int max_int = INT_MIN;
    int min_int = INT_MAX;
    int count = 0;
    double current_double, double_avg, standard_dev;
    double double_sum = 0;
    double double_squared_sum = 0;

    while ((control = getchar()) != EOF) {        
        ungetc(control, stdin);

        ret = scanf("%d", &current_int); 
        printf("%d", ret);

        if (ret == 1) {
            ret = nextinput();
            if (ret == 1) {
                ret = scanf("%c", &current_char);
                if (ret == 1) {
                    ret = nextinput();
                    if (ret == 1) {
                        ret = scanf("%lf", &current_double);
                        if (ret == 1) { 
                            int_sum += current_int;
                            double_sum += current_double;
                            double_squared_sum += pow(current_double, 2);
                            count++;

                            if (current_int > max_int) {
                                max_int = current_int;
                            }

                            if (current_int < min_int) {
                                min_int = current_int;
                            }

                            if (current_char > max_char) {
                                max_char = current_char;
                            }
                        }
                        else {
                            fprintf(stderr, "Invalid input. A double was "
                                            "missing\n");
                            return EXIT_FAILURE;
                        }
                    }
                    else {
                        fprintf(stderr, "Invalid input. There was a space "
                                        "missing or a new line found after a "
                                        "character.");
                        return EXIT_FAILURE;
                    }
                }
                else {
                    fprintf(stderr, "Invalid input. A character was missing."
                                    "\n");
                    return EXIT_FAILURE;
                }                            
            }
            else {
                fprintf(stderr, "Invalid input. There was a space missing or "
                                "a new line found after an integer.\n");
            }
        }
        else {
            fprintf(stderr, "Invalid input. An integer was missing.\n");
            return EXIT_FAILURE;
        }
    }

    standard_dev = stddev(double_sum, double_squared_sum, count);
    double_avg = double_sum / count;

    printf("Sum of integers: %d\n", int_sum);
    printf("Max integer seen: %d\n", max_int);
    printf("Min integer seen: %d\n", min_int);
    printf("Max char value seen: %d\n", max_char);
    printf("Average of doubles: %.3lf\n", double_avg);
    printf("Standard deviation of doubles: %.3lf\n", standard_dev);

    return EXIT_SUCCESS;
}
double stddev(双和,双平方和,int n){
双方差,结果;
方差=((n*平方和)-pow(和,2))/(n*(n-1));
结果=sqrt(方差);
返回结果;
}
int nextinput(){
int真=1;
int假=0;
int current=getchar();
if(isspace(当前)){
while(isspace(current=getchar())){
如果(当前=='\n'){
返回false;
}
}
}
否则{
返回false;
}
ungetc(电流、标准输入);
返回true;
}
int main(){
字符当前字符;
int ret,当前_int,控制;
int max_char=0;
int_sum=0;
int max_int=int_MIN;
int min_int=int_MAX;
整数计数=0;
双电流,双平均值,标准偏差;
双倍和=0;
双平方和=0;
而((control=getchar())!=EOF){
ungetc(控制,标准输入);
ret=scanf(“%d”和当前值);
printf(“%d”,ret);
如果(ret==1){
ret=nextinput();
如果(ret==1){
ret=scanf(“%c”和当前字符);
如果(ret==1){
ret=nextinput();
如果(ret==1){
ret=scanf(“%lf”和当前双精度);
如果(ret==1){
int_sum+=当前int;
double_sum+=当前_double;
double_squared_sum+=pow(当前_double,2);
计数++;
如果(当前值>最大值){
最大值=当前值;
}
如果(当前整数<最小整数){
最小值=当前值;
}
如果(当前字符>最大字符){
最大字符=当前字符;
}
}
否则{
fprintf(stderr,“无效输入。双精度为”
“失踪”;“失踪”;
返回退出失败;
}
}
否则{
fprintf(stderr,“无效输入。存在空格”
“a后缺少或找到新行”
"品格";;
返回退出失败;
}
}
否则{
fprintf(stderr,“输入无效。缺少字符。”
“\n”);
返回退出失败;
}                            
}
否则{
fprintf(stderr,“无效输入。缺少空格或”
“在整数后找到新行。\n”);
}
}
否则{
fprintf(stderr,“无效输入。缺少整数。\n”);
返回退出失败;
}
}
标准偏差=标准偏差(双和、双平方和、计数);
平均双倍=双倍总和/计数;
printf(“整数和:%d\n”,整数和);
printf(“看到的最大整数:%d\n”,最大整数);
printf(“看到的最小整数:%d\n”,最小整数);
printf(“看到的最大字符值:%d\n”,最大字符);
printf(“双倍平均值:%.3lf\n”,双倍平均值);
printf(“双精度标准偏差:%.3lf\n”,标准偏差);
返回退出成功;
}
该程序不应该提示用户输入,我们只需要重定向来自文件的输入。我的测试文件包含以下内容:

开始文件

一,

结束文件

我使用printf()检查变量,并将
ret
设置为1,但如果执行
语句,则
中的所有代码都不会被执行。然后,
ret
被设置为-1,代码给了我错误消息。看起来是这样的:

开始输出

输入无效。缺少一个整数。
1-1
结束输出


有人能帮我理解为什么会这样吗?我的程序还有很多内容,但在我的程序终止之前似乎没有执行。

关于此函数:

int nextinput()
{
    int true = 1;
    int false = 0;
    int current = getchar();

    if (isspace(current))
    {
        while (isspace(current = getchar()))
        {
            if (current == '\n')
            {
                return false;
            }
            else
            {}
        }
    }
    else
    {
        return false;
    }

    ungetc(current, stdin);
    return true;
}
nextinput()函数更好的定义是:

#include <stdbool.h>

int nextInput() // for readability, use 'camel case' for function and variable names
{

    int current;

    while (isspace(current = getchar()))
    {
        if (current == '\n')
        {
            return false;
        }
    }

    ungetc(current, stdin);
    return true;
}
#包括
int nextInput()//为了可读性,函数名和变量名使用“camel case”
{
电流;
while(isspace(current=getchar()))
{
如果(当前=='\n')
{
返回false;
}
}
ungetc(电流、标准输入);
返回true;
}
但是,main()函数包含几个问题,我甚至没有查看stddev()函数

强烈建议浏览代码,看看输入文件(不正确/意外的内容)的实际情况。