EOF和0区别

题目描述

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的X形图案。

输入描述:

多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。

输出描述:

针对每行输入,输出用“*”组成的X形图案。

示例1

输入:

5

复制输出:

*   *
 * * 
  *  
 * * 
*   *

我作答的代码如下:

#include
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区别_第1张图片

这里就涉及EOF和0的区别:

C语言中,scanf函数用于从标准输入(通常是键盘)读取格式化的输入。scanf的返回值是成功读取并赋值的输入项的数量,或者当遇到输入结束(EOF)或输入失败时返回EOF。

  1. while (scanf("%d", &n) != EOF)

这个循环会一直执行,直到scanf遇到文件结束符(EOF)为止。每次循环,它会尝试从标准输入读取一个整数,并将其存储在变量n中。如果成功读取一个整数,scanf返回1(因为读取了一个输入项),循环继续。如果遇到文件结束符或输入失败,scanf返回EOF,循环终止。

这个循环通常用于从用户那里读取多个整数,直到用户决定结束输入(例如,通过按下Ctrl+D(在Unix/Linux系统中)或Ctrl+Z(在Windows系统中))。

  1. 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),因为它更加直观,并且不需要用户在每个输入之后都输入一个换行符。

所以源代码修改以下就是:

EOF和0区别_第2张图片

你可能感兴趣的:(c#)