由while(scanf("%d",&n)!=EOF)引出的小问题

本文解析了C语言中scanf函数的工作原理及其返回值的意义,并通过实例介绍了如何使用EOF来判断输入结束。

    说实话,以前没见过这种写法,没注意scanf还有返回值,EOF也没怎么见过。百度了一番,知道EOF是-1(即#define EOF (-1));scanf返回的是成功扫描进的数的个数。如scanf("%d %d",&a, &b),若a、b都输入成功返回2,成功一个返回1,都不成功返回0,错误返回-1。标题那段代码的意思是,输入Ctrl+z终止循环(这是在Windows下,在Unix环境下是Ctrl+d)。如果你输入字符a,而循环体里又没有getchar之类读字符的函数,就会死循环,因为a会一直留在输入缓冲区中。要想在输入错误的情况下终止把 !=EOF 去掉就行了,即成功输入的个数为0的情况下推出循环。

    在百度过程中见到有while(~scanf("%d",&n)!=EOF)这种写法,找不到具体的解释。后来找到“~”的解释是是取反,即0变1,1变0。试了一下这种方式在输入错误的情况下就退出循环,也就是说~0的值为-1。想了一下也就通了:计算机是以补码存放数字的,0二进制的八位补码为0000 0000,“取反”后为1111 1111,对应的就是-1的补码了。这里的取反加了引号,因为真正算术上的取反,数字符号位是不变的,即0000 0000的反码是0111 1111,而补码为0111 1111的数字是1。

在C语言中,`while(scanf("%d%d", &m, &n) != EOF)` 是一个循环结构,用于持续读取输入,直到遇到文件结束符(EOF)。 ### 含义 `scanf("%d%d", &m, &n)` 是C语言中用于从标准输入读取数据的函数,它尝试读取两个整数,并将它们分别存储到变量 `m` 和 `n` 中。`scanf` 函数的返回值是成功匹配并赋值的输入项数量。如果 `m` 和 `n` 都被成功读入,`scanf` 返回2;如果只有一个整数被成功读入,返回1;如果没有整数被成功读入,返回0;如果遇到错误或文件结束符(EOF),则返回EOF [^2]。 `while(scanf("%d%d", &m, &n) != EOF)` 这个循环条件检查 `scanf` 的返回值是否不等于EOF。只要没有遇到文件结束符,循环就会继续执行;一旦遇到文件结束符,循环就会终止 [^3]。 ### 作用 该代码的主要作用是持续读取用户输入的两个整数,直到输入结束。在循环体内部,可以对读取到的整数进行各种处理,例如计算它们的和、积等。 ### 示例代码 ```c #include <stdio.h> int main() { int m, n; while (scanf("%d%d", &m, &n) != EOF) { // 处理读取到的整数 int sum = m + n; printf("The sum of %d and %d is %d\n", m, n, sum); } return 0; } ``` ### 使用场景 - **处理多个输入数据**:当需要处理多个输入数据,且输入的数量不确定时,可以使用该循环。例如,在编程竞赛中,题目可能要求处理多组测试数据,每组数据包含两个整数,直到输入结束。 - **文件输入处理**:当从文件中读取数据时,文件的结束可以通过文件结束符来表示。使用 `while(scanf("%d%d", &m, &n) != EOF)` 可以确保程序读取文件中的所有数据,直到文件结束 [^3]。 ### 注意事项 在大多数编程竞赛或算法题目中,通常不需要检查 `scanf("%d%d", &m, &n) != EOF`,因为题目的输入通常不会涉及文件的末尾标志EOF。如果题目有明确的输入终止条件,如输入 `-1 -1` 时终止输入,只需要检查 `m == -1 && n == -1` 即可,不需要检查EOF [^1]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值