我写了这段代码。它必须读取一个介于1到4之间的整数(在函数上定义为下限和上限),如果条件失败,则输出一些错误消息并再次询问该问题。
#include <stdio.h>
#include <stdlib.h>
int varcheck(double x, char z, int lowerbound, int upperbound);
int main(){
double playerCount;
char i;
printf("Insert Number of Players: ");
scanf("%lf%c", &playerCount, &i);
while(varcheck(playerCount, i, 1, 4) == 0){
printf("Invalid Number of Players\n");
printf("Insert Number of Players: ");
scanf("%lf%c", &playerCount, &i);
}
// ...Code continues...
}
int varcheck(double x, char z, int lowerbound, int upperbound){
double r = 0;
r = x - (int)x; /*If r == 0 then its not decimal number*/
if(r != 0 || z != '\n' || x < lowerbound || x > upperbound){
return 0;
} else {
return 1;
}
}
函数进入怪异循环,有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
首先,这段代码是一团糟。
printf
和scanf
中)double
使用playerCount
double
,它的价值可能类似于12.000001
,因此r
可能永远不会是0
。getchar
,scanf
和“ \t
”(空格)之类的字符时,建议使用\n
而不是
。 x < lowerbound || x > upperbound
,因为我认为您打算这样做:x > lowerbound || x < upperbound
修复这些问题,我的代码应该可以正常工作。缩进与准确性无关。
答案 1 :(得分:0)
函数scanf
难以解析用户输入。一个问题是scanf
如果无法解析您要查询的对象,则使输入流完整/不变。示例-如果您输入“ aaa2”并尝试扫描浮点数scanf
将为您提供零结果,并且输入流仍将保留“ aaa2”。因此,下一个scanf
也将看到数据“ aaa2”,并且您将遇到无限循环。
解决方案是在转换失败时刷新输入流。可能是这样的:
#include <stdio.h>
#include <stdlib.h>
void flushInput()
{
// Keep reading from input stream until a newline is read
int c;
do
{
if ((c = getchar()) == EOF) exit(1);
} while (c != '\n');
}
int getInt()
{
int n;
char c;
while(1)
{
// scanf will return 2 if the conversion is succesful, i.e.
// if it could scan first an integer and then a character
if (scanf("%d%c", &n, &c) == 2 && c == '\n') return n;
// Conversion failed so flush the input stream
flushInput();
}
}
int main(void) {
int n;
int lowerbound = 1;
int upperbound = 4;
do
{
n = getInt();
} while (n < lowerbound || n > upperbound);
printf("n=%d\n", n);
return 0;
}
输入:
4.2
aaaa2
9
3a
2
输出:
n=2