scanf 的输入格式与 EOF 如何结束循环
参考:
https://www.cnblogs.com/xyl-share-happy/archive/2012/08/28/2660873.html
https://blog.csdn.net/jeffasd/article/details/80705487
1,scanf("%d", &n)
① 以回车作为输出的结束标志。
② 返回值为 EOF,可以按下下述按钮结束循环,
ctrl+z ->回车 -> ctrl+z -> 回车 ->ctrl+z ->回车
2,scanf("%s", s)
① 以空白字符作为输出的结束标志,该空白字符会被丢弃,但要回车才能进入循环体内。
② 返回值为 EOF,可以按下下述按钮结束循环,
ctrl+z ->回车 -> ctrl+z -> 回车 ->ctrl+z ->回车
3,scanf(“%[^\n]”, str);
① 以回车作为输出的结束标志,该空白字符并不会被丢弃。
所以要想办法读取掉,不然回车一直无法被读取,也不会被丢弃,一直在循环。
② 返回值为 EOF,可以按下下述按钮结束循环,
ctrl+z ->回车 -> ctrl+z -> 回车
4,scanf("%[^\n]%*c", str);
在 3 的基础上,利用 %*c 读入回车。其它都与 3 一样。
可以利用这个实现一次循环读取两个以回车分隔开的字符串。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> #define N 100 char s1[N]; char s2[N]; int main(void) { while (scanf("%[^\n]%*c%[^\n]%*c", s1, s2) != EOF) { for (int i = 0; i < strlen(s1); i++) printf("%c", s1[i]); puts(""); for (int i = 0; i < strlen(s2); i++) printf("%c", s2[i]); puts(""); } system("pause"); return 0; }
========== ======== ======= ====== ====== ===== ==== === == =