c语言scanf( )函数的一个问题

#include
int main()
{
int s;
while(1)
{
printf("请输入:");
scanf("%d",&s);
printf("%d ",s);
}
/*当给s从键盘接受字母的时候,该循环会出现不同,
原先(正常输入证书的时候)是等待你输入了s过后才
会输出结果,但现在(给s从键盘接受字母的时候)不
需要等待直接死循环下去。
我想请教各位长辈,这是什么原因导致的,怎样才能停
止自动死循环(给s从键盘接受字母的时候),并且,如
何让s从键盘上接收字母的时候,输出相同的字母*/

5个回答

scanf函数从输入流中读取一个数据,其返回值是成功输入的数目,比如说scanf("%d %c",&a,&b),当从键盘键入12 c时,scanf的返回值就是2;

当输入一个与scanf函数中格式转换符不匹配的数据时,scanf就不读取这个数据,而是继续放在输入流(本例中是stdin)中,下一次读取输入流的函数就从这个数据开始读取;

你的例子中,如果输入的是字符,那么与scanf中的格式转换符不匹配,字符放在输入流中,while循环一直进行,下一次scanf读取的还是上一次留在输入流中的字符,再一次不匹配,如此while函数一直执行,scanf并没有成功读取 整数的机会。代码改成如下,便可以避免无限循环的问题:

`#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int s;
while(1)
{
printf("请输入:");
fflush(stdin);//刷新输入流中的数据
if(scanf("%d",&s))
printf("%d ",s);
}
system("pause");
return 0;
}



programmer_devotion
programmer_devotion 谢谢您的悉心解答,我想到了清空缓冲区,也试过,确实可以。我就是不知道为什么会一直无限循环下去。不过现在看了您们的见解,我明白了很多。感谢
5 年多之前 回复

scanf("%d"要求输入整形数据不接受字符

试试下面的代码:

    int s = 0;
    char c = 0;
    while(1)
    {
        printf("请输入:");
        scanf("%d",&s);
        scanf("%c",&c);
        if(0x10 != c)
        {
            break;
        }
        printf("%d \r\n",s);
    }
programmer_devotion
programmer_devotion 谢谢您的回答
5 年多之前 回复

你定义的s是整形,证书是数字整形所以没问题,而字母是字符形的,所以出现错误。下面是代码,已验证
#include
int main()
{
char *a;
while(1)
{
printf("请输入:");
scanf("%s",&*a);
printf("%s \n",a);
}
}

programmer_devotion
programmer_devotion 谢谢您的回答,不过您的程序会出现问题,首先您定义了一个字符指针char *a;但是您并没有给它分配空间,所以输入值不可能会存进去
5 年多之前 回复
programmer_devotion
programmer_devotion 谢谢您的回答,不过您的程序会出现问题,首先您定义了一个字符指针char *a;但是您并没有给它分配空间,所以输入值不可能会存进去
5 年多之前 回复
hebdzw
hebdzw scanf("%s",&*a);这一行改成scanf("%s",a);
5 年多之前 回复

楼主scanf中是%d,自然是只能输入整数存储的数据,所以输入字符会出错,如果想输出字符,可以定义char变量,scanf中用%c啊

programmer_devotion
programmer_devotion 谢谢您的解答。
5 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐