Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c语言中的无限循环问题_C_Loops_Infinite - Fatal编程技术网

c语言中的无限循环问题

c语言中的无限循环问题,c,loops,infinite,C,Loops,Infinite,下面的代码是编译的,但是当我运行它时,我有一个错误,导致无限循环。循环甚至没有到达scanf,我应该在那里输入新值,相反,它总是打印提示。我到底做错了什么导致了这个问题 #包括 #包括 //变数 布尔标志=假; int输入=0; //函数原型 void获取_输入(void); bool是有效的(int); 无效打印图案(整数); int main(){ 获取输入(); 打印图形(输入); 返回0; } void get_输入(){ while(flag==false){ printf(“请输入介

下面的代码是编译的,但是当我运行它时,我有一个错误,导致无限循环。循环甚至没有到达scanf,我应该在那里输入新值,相反,它总是打印提示。我到底做错了什么导致了这个问题

#包括
#包括
//变数
布尔标志=假;
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;
}