@xingxing
2017-07-17T03:18:24.000000Z
字数 1301
阅读 925
scanf 多组输入
背景:经常要用到多组输入,即读到文件末尾。此时可用scanf()函数的返回值来实现。
(一)
while(scanf() != EOF)
while(~scanf())
以上两种方法都是读到文件尾结束,两者等价。
一般在读到输入流结尾时,scanf返回的是EOF,EOF是在头文件stdio.h中定义的常量,一般为-1.(~(-1) = 0)-1的原码为10000001,反码(原码符号位不变,其余位取反)是11111110,补码(原码符号位不变,其余位取反,末尾加1或者反码加1)是11111111.
~EOF是对EOF按位取反操作,结果是00000000,此时就不满足while条件,循环结束。
借鉴:
http://blog.csdn.net/buxizhizhou530/article/details/38949033
(二)
scanf()返回读取成功的数据个数。
注意:有逗号的语句,最终语句的值等于最后一个逗号后面的语句的值。
eg:
while(scanf("%d",&n),n)
当n为0时中止循环
eg
while(~scanf("%d",&n))
当读到文件结尾时中止循环
来自:
研读:
gets与scanf如何判断读取文件结束
scanf()函数慎重使用
题目:(学习多组输入并且每组输入也是多组的处理方式)
词语首位接龙,能够拼出从b到m输出Yes.否则输出No.
HDU1181
解题思路:
dfs。
疑惑:
//读到文件末尾(eof)要用Ctrl+z来模拟
加不加~的区别
有~
无~
代码:
#include <iostream>#include <cstdio>#include <cstring>using namespace std;char s[20];int maze[30][30];int e = 12;int flag;void dfs(int start){int i;if(flag) return;for(i = 0;i < 26;i++){if(maze[start][i] == 1){maze[start][i] = 0;if(i == e){flag = 1;return;}dfs(i);maze[start][i] = 1;}}}int main(){int x,y;int len;while(~scanf("%s",s))//!!!记得加上~按位取反符号,不然就是TLE{if(strcmp(s,"0") == 0) continue;memset(maze,0,sizeof(maze));flag = 0;x = s[0]-'a';len = strlen(s);y = s[len-1]-'a';maze[x][y] = 1;while(scanf("%s",s) != EOF && s[0] != '0'){x = s[0]-'a';len = strlen(s);y = s[len-1]-'a';maze[x][y] = 1;}dfs(1);if(flag) printf("Yes.\n");else printf("No.\n");}return 0;}