C 如果输入非整数,则程序无限循环,并且不接受复数输入
分配的任务是请求#个值,然后在最后输出最小值、最大值和平均值,在这一点上,我已经没有bug修复了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;
#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)