c语言中的无限循环问题
下面的代码是编译的,但是当我运行它时,我有一个错误,导致无限循环。循环甚至没有到达scanf,我应该在那里输入新值,相反,它总是打印提示。我到底做错了什么导致了这个问题c语言中的无限循环问题,c,loops,infinite,C,Loops,Infinite,下面的代码是编译的,但是当我运行它时,我有一个错误,导致无限循环。循环甚至没有到达scanf,我应该在那里输入新值,相反,它总是打印提示。我到底做错了什么导致了这个问题 #包括 #包括 //变数 布尔标志=假; int输入=0; //函数原型 void获取_输入(void); bool是有效的(int); 无效打印图案(整数); int main(){ 获取输入(); 打印图形(输入); 返回0; } void get_输入(){ while(flag==false){ printf(“请输入介
#包括
#包括
//变数
布尔标志=假;
int输入=0;
//函数原型
void获取_输入(void);
bool是有效的(int);
无效打印图案(整数);
int main(){
获取输入();
打印图形(输入);
返回0;
}
void get_输入(){
while(flag==false){
printf(“请输入介于1和9之间的奇数\n”);
scanf(“%d”,输入(&I));
if(u有效(输入)){
flag=true;
}否则{
flag=false;
}
}
}
布尔值有效(整数){
如果(数字==1 | |数字==3 | |数字==5 | |数字==7 | |数字==9){
返回true;
}否则{
返回false;
}
}
无效打印图案(整数){
int i=0;
对于(i=0;i
造成无限循环的原因可能是您输入了字符而不是整数。也许这会有帮助
void get_input(){
char ch;
while(flag == false){
printf("please enter an odd number betwen 1 and 9\n");
scanf("%d", &input);
while((ch=getchar()!= '\n') && ch != EOF); // this flushes the input buffer to get rid of characters.
flag = is_valid(input); // This is better
}
}
我还发现你的代码有问题。
i
是一个int,但您在中使用的是%s
(用于字符串)
换成
printf("%d",i);
相反,除非输入奇数,否则循环不会退出 另外,
%s
表示字符串,因此您可能需要将打印语句更改为:
printf("%d",i);
^
请将代码更改为:
flag = is_valid(input);
问题不在循环中。输出(%s)中的实际问题是%d的istead:
无效打印模式(整数){
int i=0;
对于(i=0;i
可能在输入缓冲区中:
void get_input(){
while(flag==false){
printf(“请输入介于1和9之间的奇数\n”);
scanf(“%d”,输入(&I));
while(getchar()!='\n');//清除输入bufer
if(u有效(输入)){
flag=true;
}否则{
flag=false;
}
}
}
还考虑以下验证功能:
bool有效(整数){
返回(编号%2);//检查编号
}
您陷入了scanf
陷阱:当您尝试扫描流(如文件或stdin
)中的十进制数,但流不包含有效数字时,流将重置为扫描前的状态。这意味着,您的while
循环一遍又一遍地扫描相同的无效输入
解决方案是首先读取字符串(使用scanf(“%s”,…)
或使用fgets
解析该字符串,然后使用sscanf
或更好的方法,使用strtol
解析该字符串。所有这些函数都有一个错误条件,请在其文档中进行检查。还有一个问题是如何处理输入过程中可能遇到的意外文件结尾
最后,您应该使<代码>标志>代码>本地>代码> GETYPixEng/<代码>。还要考虑<代码> GETYPurthix< /Cord>返回具有特殊值的读取值,例如-1,以指示文件结束。
示例实现可能如下所示int get_input()
{
char buf[80];
int input = 0;
bool flag = false;
while (flag == false) {
printf("please enter an odd number betwen 1 and 9\n");
if (fgets(buf, sizeof(buf), stdin) == NULL) return -1;
flag = (sscanf(buf, "%d", &input) == 1 && is_valid(input));
}
return input;
}
(是的,以一种快速而肮脏的方式读取输入以外的输入并不容易。)
其他人已经指出了错误的格式说明符,
-Wall
应该捕捉到它。如果您的输入不是一个有效的数字,则会发生无限循环,对吗?它会对每个数字进行无限循环,无论是有效的还是无效的invalid@Kevin,关闭编译器,然后打开它并再次运行此代码。它不会进入我的无限循环。(你到底在使用哪种编译器)我正在学校服务器上使用GCC编译器,并使用以下命令GCC-o program1 lab3.cno编译它。这不是答案,但printf(“%s”,I);
应该是printf(“%d”,I)
谢谢你解决了这个问题。我将详细介绍一下解决方法。我感谢你的时间和努力。应该是返回(数字<10&&1==数字%2);
这是凯文的选择:-)
int get_input()
{
char buf[80];
int input = 0;
bool flag = false;
while (flag == false) {
printf("please enter an odd number betwen 1 and 9\n");
if (fgets(buf, sizeof(buf), stdin) == NULL) return -1;
flag = (sscanf(buf, "%d", &input) == 1 && is_valid(input));
}
return input;
}