[关闭]
@xingxing 2017-07-17T11:18:24.000000Z 字数 1301 阅读 777

while之多组输入

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))
当读到文件结尾时中止循环

来自:

https://zhidao.baidu.com/question/1768531621083454060.html

研读:
gets与scanf如何判断读取文件结束
scanf()函数慎重使用

题目:(学习多组输入并且每组输入也是多组的处理方式)
词语首位接龙,能够拼出从b到m输出Yes.否则输出No.
HDU1181

解题思路:
dfs。

疑惑:
//读到文件末尾(eof)要用Ctrl+z来模拟

加不加~的区别
有~
有~

无~
无~

代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5. char s[20];
  6. int maze[30][30];
  7. int e = 12;
  8. int flag;
  9. void dfs(int start)
  10. {
  11. int i;
  12. if(flag) return;
  13. for(i = 0;i < 26;i++)
  14. {
  15. if(maze[start][i] == 1)
  16. {
  17. maze[start][i] = 0;
  18. if(i == e)
  19. {
  20. flag = 1;
  21. return;
  22. }
  23. dfs(i);
  24. maze[start][i] = 1;
  25. }
  26. }
  27. }
  28. int main()
  29. {
  30. int x,y;
  31. int len;
  32. while(~scanf("%s",s))//!!!记得加上~按位取反符号,不然就是TLE
  33. {
  34. if(strcmp(s,"0") == 0) continue;
  35. memset(maze,0,sizeof(maze));
  36. flag = 0;
  37. x = s[0]-'a';
  38. len = strlen(s);
  39. y = s[len-1]-'a';
  40. maze[x][y] = 1;
  41. while(scanf("%s",s) != EOF && s[0] != '0')
  42. {
  43. x = s[0]-'a';
  44. len = strlen(s);
  45. y = s[len-1]-'a';
  46. maze[x][y] = 1;
  47. }
  48. dfs(1);
  49. if(flag) printf("Yes.\n");
  50. else printf("No.\n");
  51. }
  52. return 0;
  53. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注