题目描述
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的X形图案。
输入描述:
多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。
输出描述:
针对每行输入,输出用“*”组成的X形图案。
示例1
输入:
5
复制输出:
* ** * * * * * *
我作答的代码如下:
#include<stdio.h>
int main()
{int a;while (scanf("%d\n", &a)!=0){for (int n = 0; n < a; n++){for (int m = 0; m < a; m++){if (n == m){printf("*");}else if (m == a - n - 1){printf("*");}else{printf(" ");}}printf("\n");}}return 0;
}
实际运行结果如下:
这里就涉及EOF和0的区别:
C语言中,scanf
函数用于从标准输入(通常是键盘)读取格式化的输入。scanf
的返回值是成功读取并赋值的输入项的数量,或者当遇到输入结束(EOF)或输入失败时返回EOF。
while (scanf("%d", &n) != EOF)
这个循环会一直执行,直到scanf
遇到文件结束符(EOF)为止。每次循环,它会尝试从标准输入读取一个整数,并将其存储在变量n
中。如果成功读取一个整数,scanf
返回1(因为读取了一个输入项),循环继续。如果遇到文件结束符或输入失败,scanf
返回EOF,循环终止。
这个循环通常用于从用户那里读取多个整数,直到用户决定结束输入(例如,通过按下Ctrl+D(在Unix/Linux系统中)或Ctrl+Z(在Windows系统中))。
while (scanf("%d\n", &n) != 0)
这个循环也会一直执行,直到scanf
返回0为止。但是,这里有一个细微的差别。在格式字符串"%d\n"
中,\n
表示一个换行符。这意味着scanf
不仅会尝试读取一个整数,还会尝试读取一个换行符。如果用户输入了一个整数但没有紧接着输入一个换行符,scanf
会阻塞,等待用户输入换行符。只有当用户输入了一个整数并按下回车键(产生换行符)时,scanf
才会返回1,表示成功读取了一个整数。如果用户直接输入了EOF(例如,通过按下Ctrl+D或Ctrl+Z),则scanf
会返回EOF,循环会终止。
使用"%d\n"
作为格式字符串可能会导致用户感到困惑,因为他们需要在每个整数之后输入一个换行符。此外,如果在程序中其他地方也使用标准输入,并且期望能够读取不带换行符的输入,这可能会导致问题。
总的来说,推荐使用while (scanf("%d", &n) != EOF)
,因为它更加直观,并且不需要用户在每个输入之后都输入一个换行符。
所以源代码修改以下就是: