C 如果输入非整数,则程序无限循环,并且不接受复数输入

C 如果输入非整数,则程序无限循环,并且不接受复数输入,c,C,分配的任务是请求#个值,然后在最后输出最小值、最大值和平均值,在这一点上,我已经没有bug修复了 #include <stdlib.h> #include <stdio.h> #include <math.h> int main() { int ErrorDetection = 1; char valCounter; int valnumber; int Incrementer; int StoredValue;

分配的任务是请求#个值,然后在最后输出最小值、最大值和平均值,在这一点上,我已经没有bug修复了

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

int main()
{
    int ErrorDetection = 1;
    char valCounter;
    int valnumber;
    int Incrementer;
    int StoredValue;
    int MinimumValue = 100;
    int MaximumValue = 0;
    float Average;
    int AddToStored;
    int Sum = 0;

    printf("MIN, MAX, and MEAN CALCULATOR\n\n");

    while (ErrorDetection != 0)
    {
        printf("How many values are to be entered?\n");
        scanf("%s", &valCounter);

        if (valCounter > '0' && valCounter < '9') {
            ErrorDetection = 0;
        }
        else {
            ErrorDetection = 1;
            printf("INPUT ERROR!\n");
        }
        valCounter = valCounter - 47;
    }

    for (Incrementer = 1; Incrementer < valCounter; Incrementer++)
    {
        ErrorDetection = 1;

        while (ErrorDetection != 0) {
            printf("Value %d: ", Incrementer);
            scanf(" %d", &StoredValue);

            if (StoredValue > 0 && StoredValue < 9) {
                ErrorDetection = 0;
            }
            else {
                ErrorDetection = 1;
                printf("INPUT ERROR!\n");
                continue;
            }
        }

        if (StoredValue > MaximumValue) {
            MaximumValue = StoredValue;
        }
        if (StoredValue <= MinimumValue) {
            MinimumValue = StoredValue;
        }
        Sum = Sum + StoredValue;
    }

    valCounter = valCounter - 1;
    Average = (float)Sum / (float)valCounter;

    printf(
        "Minimum value is %d, maximum value is %d, and average value is %g.\n",
        MinimumValue, MaximumValue, Average
    );
}
#包括
#包括
#包括
int main()
{
内部错误检测=1;
字符计数器;
整数;
整数递增器;
int存储值;
int最小值=100;
int最大值=0;
浮动平均;
int AddToStored;
整数和=0;
printf(“最小值、最大值和平均值计算器\n\n”);
while(错误检测!=0)
{
printf(“要输入多少值?\n”);
scanf(“%s”、&valCounter);
如果(valCounter>'0'和&valCounter<'9'){
错误检测=0;
}
否则{
错误检测=1;
printf(“输入错误!\n”);
}
valCounter=valCounter-47;
}
for(Incrementer=1;Incrementer0&&StoredValue<9){
错误检测=0;
}
否则{
错误检测=1;
printf(“输入错误!\n”);
继续;
}
}
如果(存储值>最大值){
最大值=存储值;
}

如果(StoredValue您在这里有未定义的行为

     char valCounter;

    scanf("%s", &valCounter);
您已将
valCounter
声明为
char
type,但正在尝试读取
string
type

因此,将
scanf
更改为

scanf("%c", &valCounter);

我建议您将
valCounter
声明为
int

int valCounter;
scanf("%d", &valCounter);
在这种情况下,您的
if
将变为

if ((valCounter > 0) && (valCounter < 9)) 
此外,您的
for
循环应该从0开始,而不是从1开始

for(Incrementer = 1 ; Incrementer < valCounter; Incrementer++)
for(Incrementer=1;Incrementer
应该是

for(Incrementer = 0 ; Incrementer < valCounter; Incrementer++)
for(Incrementer=0;Incrementer
您的问题就在这里

char valCounter;
scanf("%s", &valCounter);
您告诉scanf
读取一个字符串,但您给它传递了一个字符的地址。您应该请求一个整数,并给它一个整数的地址

int valCounter;
scanf("%d", &valCounter)
这里有更多信息,包括为什么
scanf
可能不是最好的主意:

请注意,您只允许1到8之间的计数(包括1和8)。我可以看到消除0;为什么不也允许9?使用
valCounter=valCounter-47;
最好使用
'0'
(48)-
valCounter-='0'-1;
减去47。我不知道为什么你有47;这意味着
'1'
映射到
2
,以此类推。对神奇数字要小心!@JonathanLeffler这就是为什么OP从
1
而不是
0
开始循环的原因。这是一个解决你指出的错误的方法。完成了上面和c将错误检测从字符值挂起为整数值,但现在如果输入了2位数字作为值的数量,例如14,则1用作值的数量,4用作值1,而不是14用作初始值,如果输入了非整数值,则程序也会循环(如果读取链接),我想你会发现很多相关信息。我认为其中一些信息肯定与如何避免从输入流中读取太多或太少的数据有关。那么,我如何使用fgetc以与scanf相同的方式存储变量?如果我将incrementer更改为0,则要求1值会给我“值1:值2:”@DylanWolfer你应该减去
valCounter=valCounter-'0';
而不是
valCounter=valCounter-47;
。你看到jonathan lefler对此的评论了吗?
int valCounter;
scanf("%d", &valCounter)