C语言基础 -- scanf函数的返回值及其应用

文章讲述了scanf函数的返回值机制,包括其正常和无输入情况下的返回值,并演示如何利用返回值处理未知数量的输入,如判断奇偶数输入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言、scanf函数有返回值

我们在作PTA上的编程作业时,经常在编译窗口会看到如下的信息:

warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]

当时老师一定会告诉你,这个一个"warning"的报警,可以不用管它,也确实如此。不过,这条报警信息我们至少可以知道一点,就是scanf函数调用完之后是有一个返回值的,下面我们就要对scanf返回值进行详细的讨论。并给出在编程时利用scanf的返回值可以实现的一些功能。

一、scanf的返回值

我们先来看一个例子。

输入:

3 5

代码:

#include <stdio.h>
int main () {
	int a,b,c;
	c = scanf("%d%d", &a, &b);
	printf("the return value of scanf is: %d\n", c);
	return 0;
}

输出:

the return value of scanf is: 2

从这个例子我们可以看出,scanf函数确实是有返回值的。当我们执行上面的代码,并输入两个数3和5时,首先会执行scanf函数的调用,输入了两个整数(完成输出后scanf就有了返回值),然后执行printf函数,按照格式把scanf的返回值输出。从这个例子我们也可以大胆的猜测,scanf函数的返回值,就是scanf正确读入的变量的个数。这个猜测对了一半,完整的表述应该是:

scanf函数的返回r满足:(1)当输入流中有输入时,r等于scanf函数正确读入的变量的个数;(2)当输入流中没有输入时,r等于-1。

注意:没有输入和没有正确输入是不一样的情况,我们下来举例说明。

代码:

#include <stdio.h>
int main () {
	int a,b;
	printf("%d\n", scanf("%d,%d", &a,&b));
	return 0;
}

对于上面 的代码,我们分别给出三个输入和输出的例子来说明。

输出1:

3 5

输出1:

1

注意代码中scanf函数调用的第一个参数,也就是格式匹配字符串为"%d,%d",而输出流中的输入为"3 5"。显然对输入流中的'3',scanf函数可以正确输入;然后按照格式匹配字符串,3后面应该匹配一个',',但是输入流里面却没有正确匹配,所以scanf就无法继续输入而返回。因为已经有了一个正确输入,故返回值就是1。

输出2:

,3,5

输出2:

0

这个例子中,输入流中第一个(非空白)字符','就与匹配字符串种的第一个字符'%d'不匹配,从而scanf函数无法继续输入而返回。这时并没有正确输入,故返回值是0。

输出3:

^Z

输出3:

-1

注意输入3中的输入并不是"^Z",而是在windows下用ctrl+z模拟了没有任何返回值,在mac下用ctrl+d,在PTA平台上就是输入为空。这时输入流中根本没有任何输入,故返回值是-1。

二、scanf函数返回值的妙用

我们经常在PTA作业里遇到这样的输入问题,就是需要你输入一些数据,但是又没有告诉你这些数据一共有多少个,这时候我们用scanf的返回值就可以解决这个问题。

举一个具体的例子:要求输入一组整数,并且按输入次序输入这组整数的奇偶,奇数输入1,偶数输出0。

输入样例:

12 23 34 45 56 67 78 89 91 13 24 35

输出样例:

0 1 0 1 0 1 0 1 1 1 0 1

代码:

#include <stdio.h>
int main () {
	int a;
	while(scanf("%d", &a) != EOF) {
		printf("%d ", a%2);
	}
	return 0;
}

上面的代码,我们用了while循环结合scanf函数的返回值,完成了对未知个数据的输入。具体来说:while的循环条件就是scanf("%d", &a) != EOF,这了EOF就等-1,直接写成-1也可以。当输入流中还有输入时scanf("%d", &a)的返回值就不可能等与-1,循环条件为真,循环就继续。当scanf扫描的输入流的末尾,没有东西可以输入时,scanf("%d", &a)返回-1,循环条件为假,循环结束。

注意:如果输入的是若干个字符,中间用空格隔开,则需要在匹配字符串中适当的位置匹配空格。

### C语言 `scanf` 函数返回值的意义解释 在C语言中,`scanf` 是一个用于读取格式化输入的标准库函数。此函数不仅负责接收用户的键盘输入并将其存储到指定的变量中,还提供了一个重要的特性——返回值。 #### 返回值表示已成功赋值的项目数量 当调用 `scanf` 时,其返回的是成功解析并赋值的数据项数目[^1]。例如: ```c int num; char str[20]; float f; // 假设用户输入 "12 hello 3.4" int result = scanf("%d %s %f", &num, str, &f); ``` 在这个例子中,如果三个参数都被正确地从输入流中读取,则 `result` 将等于3。这表明所有的预期转换都已完成,并且相应的内存位置已被更新为新的数据值。 #### 处理错误情况下的返回值 对于不成功的尝试,比如遇到文件结束符(EOF),或者无法匹配任何有效的输入模式,`scanf` 的行为如下: - 如果到达了输入结尾而没有任何有效字符可读取,那么它会立即停止执行并向调用者报告 `-1` 表示遇到了 EOF 条件。 - 当某些部分未能按照期望的方式进行转换时(如格式说明符与实际提供的数据不符),则只计算那些确实完成转换的部分作为返回的结果数。这意味着即使只有一个或两个字段被成功处理,其余未成功的情况也不会影响之前的成功次数统计。 因此,在编写程序逻辑时应当始终检查 `scanf` 的返回值来验证操作是否按计划顺利完成,从而提高代码健壮性和安全性[^4]。 #### 安全实践建议 考虑到潜在的安全风险以及为了增强应用程序的整体质量,推荐采用更安全版本的 `scanf` —— 即 `scanf_s` 或其他替代方案,这些改进后的接口通常带有额外的功能以防止缓冲区溢出等问题的发生[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值