您现在的位置: 365建站网 > 365文章 > C语言scanf()函数返回值的问题

C语言scanf()函数返回值的问题

文章来源:365jz.com     点击数:625    更新时间:2018-06-02 11:23   参与评论
1.scanf()函数有返回值且为int型。
2.scanf()函数返回的值为:正确按指定格式输入变量的个数;也即能正确接收到值的变量个数。

scanf("%d%d", &a, &b);
如果a和b都被成功读入,那么scanf的返回值就是2
如果只有a被成功读入,返回值为1
如果a和b都未被成功读入,返回值为0
如果遇到错误或遇到end of file,返回值为EOF。

不经意中发现scanf()的返回值问题,自己试验和了解了一下,一些所知与各位分享;
void main()
{
int a;
int b;
int c;
printf("请输入三个整数:");
int x=scanf("%d%d%d",&a,&b,&c);
printf("%d/n%d/n",a,x);
}
1.scanf()函数有返回值且为int型。
2.scanf()函数返回的值为:正确按指定格式输入变量的个数;也即能正确接收到值的变量个数。
从上边的例子中可以得到验证,这里用变量x接收scanf()函数的返回值,并输出显示出来。

当运行中输入三个整数:5 6 7则x的值为3;

如果输入5 6 d(即给c 赋值不正确)则x的值为2;

如果输入5 t d(即给b和c 赋值不正确)则x的值为1;

当scanf函数的第一个变量格式不正确时返回值为0,即,当scanf函数的第n个变量格式不正确时,返回值为n-1



continue:

以前学习的时候书上说的是scanf()的返回值等于得到输入值的输入项的个数
scnaf(格式控制,输入项表);
照以上一般形式来看的话
main()
{int a,b,i;
i=scanf("%d%d%d",&a,&b);
printf("%d",i);}
应该输出2,因为就a和b两个输入项得到值了。
但是结果却是3
为什么?
这样的话是不是应该说成得到输入数据的格式说明的个数?

是3,因为是3个%d,输入项的个数是3个,不过是进了缓冲区3个,两个被赋值了,一个扔掉了而已。

那scanf()的返回值应该是进缓冲区的数据的个数,或是说得到输入数据的格式说明的个数,对吗?
像这样scanf("%d%d%d"如果输入1 2 3那返回值就是3,要是输入1 a 那返回值就是1因为只有第一个%d得到数据了,对吗?

scanf 函数的返回值反映的是按照指定的格式符正确读入的数据的个数。
如果输入数据与指定格式不符,则会产生输入错误。遇到输入错误,scanf函数会立即终止,返回已经成功读取的数据的个数。
所以,通过scanf函数的返回值和指定输入数据的个数(由格式符决定)的比较,可以判断数据输入是否成功。

就楼主的这个程序而言,是一个错误的程序,会导致segmentation fault,
因为没有有效的地址接受这个输入的第三个数,whyglinux的解释是正确的,
如果程序可以正常的继续下去执行的话,返回值应该是2.
具体你的程序为什么能够返回,我不知道,我用的是gcc,winxp,运行的时候segmentation fault.

1. scanf 函数是有返回值的,它的返回值可以分成三种情况
  1) 正整数,表示正确输入参数的个数。例如执行 scanf("%d %d", &a, &b);

      如果用户输入"3 4",可以正确输入,返回2(正确输入了两个变量);
      如果用户输入"3,4",可以正确输入a,无法输入b,返回1(正确输入了一个变量)。

  2) 0,表示用户的输入不匹配,无法正确输入任何值。如上例,用户如果输入",3 4",返回0。
  3) EOF,这是在stdio.h里面定义的常量(通常值为-1),表示输入流已经结束。在Windows下,用户按下CTRL+Z(会看到一个^Z字符)再按下回车(可能需要重复2次),就表示输入结束;Linux/Unix下使用CTRL+D表示输入结束。

所以可以使用下面的代码来处理输入:
while (scanf("%s %c %c", str, &oldchar, &newchar) == 3) /* 或!= EOF , 但前者更好 */
{
    ; //处理
}

2. 为什么前面 scanf 的格式串里面,%s和%c中间需要空格呢?
  那是因为如果没空格的话。。。oldchar输入的就是空格了= =.

3. 顺便说一下,printf的返回值是输出的字符数,例如,printf("1234")的返回值是4,而printf("1234\n")的返回值是5。

以下内容原创:

不知道有木有这样写的习惯while (~scanf("...."))。这里出现了~这个符号,这个是位运算取反的意思。因为~(n)=-(n+1)。所以这里scanf的返回值为-1时~(-1)=0才退出循环。这就是这样写的意思。

如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛

发表评论 (625人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
昵称:
最新评论
------分隔线----------------------------

快速入口

· 365软件
· 杰创官网
· 建站工具
· 网站大全

其它栏目

· 建站教程
· 365学习

业务咨询

· 技术支持
· 服务时间:9:00-18:00
365建站网二维码

Powered by 365建站网 RSS地图 HTML地图

copyright © 2013-2024 版权所有 鄂ICP备17013400号