@xingxing
2017-07-17T11:18:24.000000Z
字数 1301
阅读 777
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;
}