想问一下这个代码在读取数字的时候为什么在我自己的编译器里是死循环,但是在洛谷上却通过了呢O.o
很需要一位佬解一下惑,感谢!!
题目如下
int main(void)
{
int input[1000];
int i=0;
int t,n,j;
while(scanf("%d",&input[i])!=-1)
{
getchar();
i++;
}
for(n=0;n-1;n++)
{
for(j=0;j-1;j++)
{
if(input[j]>input[j+1])
{
t=input[j];
input[j]=input[j+1];
input[j+1]=t;
}
}
}
for(n=i-2;n>=0;n--)
{
if(input[n]!=input[i-1])
break;
}
printf("%d",input[n]);
return 0;
}
这么改试试,供参考:
#include <stdio.h>
int main(void)
{
int input[1000];
int i = 0;
int t, n, j, ret;
while (1)
{
ret = scanf("%d", &input[i]);//修改 Ctrl + Z 结束输入,如:1 2 3 4 4^Z
if (ret == 1)
i++;
else
break;
}
for (n = 0; n < i - 1; n++)
{
for (j = 0; j < i - n - 1; j++)
{
if (input[j] > input[j + 1])
{
t = input[j];
input[j] = input[j + 1];
input[j + 1] = t;
}
}
}
for (n = i - 2; n >= 0; n--)
{
if (input[n] != input[i - 1])
break;
}
printf("%d", input[n]);
return 0;
}
运行如图:
chatgpt:
在这段代码中,主要问题出现在 while 循环中。while 循环使用 scanf() 函数读取输入,但是判断循环条件的语句 scanf("%d",&input[i])!=-1 有问题,这个条件并不会在输入结束时返回 -1,而是会返回读取的元素个数,因此在某些情况下会导致死循环。
正确的做法应该是判断 scanf() 函数的返回值,如果返回值不是 1,则说明读取失败,循环应该退出。修改后的代码如下:
int main(void)
{
int input[1000];
int i=0;
int t,n,j;
while (scanf("%d", &input[i]) == 1) {
getchar();
i++;
}
for (n = 0; n < i - 1; n++) {
for (j = 0; j < i - n - 1; j++) {
if (input[j] > input[j + 1]) {
t = input[j];
input[j] = input[j + 1];
input[j + 1] = t;
}
}
}
for (n = i - 2; n >= 0; n--) {
if (input[n] != input[i - 1]) {
break;
}
}
printf("%d", input[n]);
return 0;
}
这样就可以避免死循环的问题了。另外,代码中使用 getchar() 函数读取输入中的空格字符,这是因为 scanf() 函数在读取整数后会将空格字符留在输入缓冲区中,下一次读取时会直接读取到空格字符。使用 getchar() 函数可以清除输入缓冲区中的空格字符。
你怎么发现死循环的呢?结束时输入CTRL+Z组合键
#include "stdafx.h"
#include <stdio.h>
int main(int argc, char* argv[])
{
int nNum = 0;
scanf("%d",&nNum);//输入AB
printf("%d\n",nNum);
char chA = '0';
chA = getchar();
printf("%c\n",chA);
return 0;
}
将AB送到缓冲区,scanf函数读取缓冲区内容,发现与格式不匹配,不会把值赋给nNum,他并不会丢弃该内容,而是将其放回缓冲区,下一次缓冲区读取仍从这里开始,所以下面chA的值为A
这段代码可能会导致死循环是因为在输入数字时,如果输入的不是数字或者不是完整的数字,scanf函数会将输入缓冲区中的非数字字符留在缓冲区中,下一次读取时会直接读取这些非数字字符,从而导致死循环。解决方法有两种:
1.在使用scanf函数读取数字之前,先清空输入缓冲区。可以使用下面的代码来清空输入缓冲区:
fflush(stdin);
2.使用fgets函数读取字符串,再使用sscanf函数将字符串转换为数字。这种方法可以避免输入缓冲区的问题。具体代码如下:
char str[100];
fgets(str, 100, stdin);
sscanf(str, "%d", &input[i]);