`

scanf()的返回值

 
阅读更多

http://blog.csdn.net/linuxxulin/article/details/7018321

 

不经意中发现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.

continue:

其实对于scanf这样的一些库函数其实对其来讲,他们使用起来并不是很友好,比如在不同的编译环境中,他们得到的结果数值是不一样的

,这就需要如果我们需要在实际应用使用他们的话,就需要我们对他进行一些实际考证,这样才可以放心使用,其实说白啦,

它的可移植性并不是很优秀吧

分享到:
评论

相关推荐

    (2条消息) scanf返回值被忽略的原因及其解决方法_灶星闪闪的博客-CSDN博客(2).url

    (2条消息) scanf返回值被忽略的原因及其解决方法_灶星闪闪的博客-CSDN博客(2).url

    使用scanf().zip

    3. **错误处理**:如果输入不符合格式,`scanf()`可能会失败并返回非零值,此时需要检查返回值来处理错误。 4. **跳过空白字符**:默认情况下,`scanf()`会自动跳过前导的空白字符,直到遇到非空白字符才开始读取。 ...

    scanf的用法

    ### scanf函数详解 #### 一、函数概述 `scanf`函数是C语言中用于从标准输入设备(通常是键盘)读取格式化数据的一种方法。它允许程序员根据指定的格式读取用户输入的数据,并将其存储到相应的变量中。`scanf`函数...

    cin和scanf在使用时的注意事项

    4. **错误处理**:`scanf`的错误处理不如`cin`直观,当读取失败时,返回值会小于提供的变量数量。需要通过返回值检查是否成功读取。 5. **内存溢出**:`scanf`不会检查目标变量是否有足够的空间存储输入,可能导致...

    C语言编程中scanf函数的详细用法

    - `scanf`函数返回值是读取成功的项目数。如果与预期不符,可能会导致数据丢失或程序出错。 5. **陷阱与常见错误**: - 不匹配的类型:如尝试用`%d`读取浮点数会导致问题。 - 没有提供足够的变量:如果`format`...

    C语言 中scanf详解.pdf

    `scanf`函数的返回值表示成功读取的变量数量,如果所有变量都被正常读取,返回值就是变量的数量。但当输入不匹配或遇到非法数据时,可能会导致键盘缓冲区中存在未处理的输入,这需要开发者特别留意。 `scanf`处理...

    C语言中使用scanf()函数常见问题解析.pdf

    通常做法是检查返回值,如果返回值小于预期的赋值项数,表示输入可能有误。 ### 结语 掌握`scanf()`函数的正确使用是C语言学习者的基本技能。理解其工作原理,注意格式化字符串、变量地址和数据类型匹配,以及如何...

    scanf详细介绍

    3. **错误检测**:通过检查`scanf`的返回值,可以判断是否成功读取了所有期望的输入。如果返回值小于预期的参数数量,可能是因为输入不符合格式或输入结束。 4. **预读和跳过字符**:使用`*`前缀可以告诉`scanf`跳...

    scanf.rar

    ### `scanf`的返回值 `scanf`函数返回的是读取成功的项目数,包括成功匹配的格式说明符和赋值的变量。如果遇到无法匹配的输入或者读取过程中出现错误,`scanf`将返回非零值,具体值取决于失败的位置。 ### 实际...

    程序设计-用scanf函数实现数据的输入.pptx

    此时,可以通过检查`scanf`的返回值来判断是否成功读取。 4. **清除输入缓冲区**:在某些情况下,可能需要清除输入缓冲区中的剩余字符,这可以使用`getchar()`或`fflush(stdin)`来实现,但`fflush(stdin)`的行为在...

    C语言无参无返回值计算器

    根据提供的文件信息,本文将详细解析“C语言无参无返回值计算器”的核心知识点,包括其功能、实现原理以及代码解读等。 ### C语言无参无返回值计算器概述 此计算器是一个简单的C语言程序,其特点是没有参数输入也...

    c代码-while(scanf("%d%d", &i, &j) == 2) 和 while(~scanf("%d%d",&a,&b)) 的差别

    因为`scanf()`的返回值在成功读取时不会是0,所以`~scanf()`在读取成功时会得到非零值,导致循环继续。然而,如果`scanf()`返回EOF,它将变为0,`~EOF`会得到一个非零值(通常是一个大的负数),这也会导致循环继续...

    详解C语言sscanf()函数、vsscanf()函数、vscanf()函数

    在C语言中,`sscanf()`、`vsscanf()`和`vscanf()`函数都是用于从不同来源读取数据并按指定格式进行解析的。它们是`scanf()`家族的一部分,提供了一种灵活的方式来处理输入数据。 1. `sscanf()`函数: `sscanf()`...

    C语言有参有返回值高级计算器

    - **输入处理**:使用`scanf("%d", &variable);`获取用户输入的整数,并将其存储到指定的变量中。 - **输出显示**:使用`printf`函数显示菜单、提示信息以及最终的计算结果。 #### 2.3 控制流程 - **循环控制**:...

    浅析C语言中printf(),sprintf(),scanf(),sscanf()的用法和区别

    - `printf()`, `sprintf()`, `scanf()`, 和 `sscanf()` 的返回值是成功处理的格式化项的数量。这在需要知道处理了多少输入或输出时很有用。 总结来说,这些函数提供了强大的格式化输入输出能力,可以根据需要灵活...

    file scanf

    它与`scanf`函数类似,但`fscanf`是从指定的文件流中读取,而不是从标准输入(通常是键盘)读取。在深入理解`fscanf`的用法之前,我们先来了解一下基本的文件操作概念。 在C语言中,文件操作通常涉及打开、读取、...

    c语言 sscanf,scanf,fscanf正则表达式用法

    C语言 sscanf, scanf, fscanf 正则表达式用法 ...scanf族函数可以用来读取输入数据,但是需要注意格式参数的设置和返回值的解释。同时,scanf族函数也支持有限的正则表达式用法,可以用于读取特定的字符串。

Global site tag (gtag.js) - Google Analytics