【求解】为啥会陷入死循环?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【求解】为啥会陷入死循环?相关的知识,希望对你有一定的参考价值。

在执行的时候,如果输入任何字母

#include<stdio.h>int main() int a; int b; while(1)
printf("请输入第一个数字:"); scanf("%d",&a); printf("请输入第二个数字:"); scanf("%d",&b); if(a>b) printf("%d大于%d\n",a,b); else if(b>a) printf("%d大于%d\n",b,a); else if(a==b) printf("两数相等\n"); else printf("Error");
return 0;
我知道是数据输入不符,可他这个结果是怎么来的

while(1) 肯定是让你的程序陷入死循环了。
每次到scanf的时候,程序就会在这阻塞,等待用户输入数据,并清空缓冲区,等待的时候看起来好像不是死循环了,其实你的程序跳不出这个while的。
当输入错误的时候,scanf没有得到想要的输入,但缓冲区有数据,就会跳过scanf,不停的循环了。
在循环结尾的地方清空缓冲区应该对会有效果。fflush(stdin);追问

他这个会一直不断的占用内存吗?

追答

在程序执行的过程中肯定是占用着int a和int b的内存的。反正你的程序没有动态分配内存,所以循环中不会占用别的内存,这个问题你就不用担心了

参考技术A 缓冲区惹得祸,输入格式和数据不匹配时会导致scanf的临时输入缓冲区溢出,你可以打印出来看一下,当输入一个字母时a的值是一个溢出的整数。记得scanf在每一次接受输入之前会先从缓冲区中读一个字符然后才会从stdin中读取用户输入的字符,而前者的溢出会导致后者得不到执行,因此不论后面调用几次scanf或者是在死循环时不断的输入正确的值也无济于事。
最保险的解决办法是在每次调用scanf之后增加一条缓冲区刷新指令fflush(stdin),可确保恢复

具体细节可以区看一下ucLibc或者gLibc的源码,以前研究linux下的C库时看过,不过记不太清楚了本回答被提问者采纳
参考技术B 你使用while语句,就陷入了死循环,while()语句是括号内的值为真就一直执行,如果你只想比较两个数大小,你把while(1)改为void main()就可以了。 参考技术C 1.字母对应就是16进制值,再转化就是整数。
2.在while的结尾加句:读取一个字符的函数,记不清名字了。
参考技术D while(1)他会一直执行,而循环体内又没有break之类的语句
解决:
其实最主要的是你想什么时候跳出循环?

代码重构 & JDTWindows命令行运行Java文件陷入死循环解决办法

通过修改某个Java文件的AST节点生成n个新程序,然后用测试用例分别对这n个新程序进行运行。但是在运行过程中,发现有些新生成的新程序会陷入死循环的情况,后台的java.exe一直在运行。解决方法是:设置每个程序最长运行时间为10秒,超时后,再使用命令行的形式杀掉后台的java.exe进程。代码如下:

//参数cmd是命令行的形式,指定测试用例的位置以及待测的程序
public static void runCMD(String cmd)
	Runtime rt = Runtime.getRuntime();
	Process process;
	try 
		process = rt.exec(cmd);
		System.out.println(process.toString());
		
		boolean exitStatus = false;
		try 
			exitStatus = process.waitFor(10, TimeUnit.SECONDS);
			if(!exitStatus)
				System.out.println("cmd execute failed!");
			
		 catch (InterruptedException e) 
			// TODO Auto-generated catch block
			e.printStackTrace();
		
		
        process.destroy(); 
        process = null;
        String command = "taskkill /f /im java.exe";  
		Process process2 = Runtime.getRuntime().exec(command);
		try 
			process2.waitFor();
		 catch (InterruptedException e) 
			// TODO Auto-generated catch block
			e.printStackTrace();
		
		
	 catch (IOException e) 
		// TODO Auto-generated catch block
		e.printStackTrace();
	

 

以上是关于【求解】为啥会陷入死循环?的主要内容,如果未能解决你的问题,请参考以下文章

Windows批处理脚本陷入死循环问题

代码重构 & JDTWindows命令行运行Java文件陷入死循环解决办法

代码重构 & JDTWindows命令行运行Java文件陷入死循环解决办法

C语言函数参数压栈顺序为何是从右到左?(从左向右的话,碰到printf的会陷入死循环)

springside4.1的shiro+cas会陷入认证死循环,跳到cas服务器登陆后无法打开页面.Firefox提示请求循环重定

为什么 HashMap 并发时会引起死循环?