【发布时间】:2021-04-05 23:51:05
【问题描述】:
我正在尝试打印一个整数平方表。目的是编写一个程序,在每 24 个方格后暂停,并要求用户打印 Enter 以继续。这并不太复杂,我已经用 C 语言“完成”了手头的任务。
我的担忧:当我编译和运行以下代码时,会出现一个看似无关紧要(但可以观察到)的小问题:
#include <stdio.h>
int main()
{
int i, n;
printf("This Program prints a table of squares. \n");
printf("Enter number of entries in table: ");
scanf("%d", &n);
for(i = 1; i <= n; i++) {
if((i - 1) % 24 == 0 && i > 1) {
printf("Press Enter to continue...");
while(getchar() != '\n')
;
}
printf("%10d%10d\n", i, i*i);
}
}
我的输出是完美的,正是我想要的,除了对于 24 的第一个倍数(即 24)。出于某种原因,如果我选择一个大的 n,表格将完美打印出来,但只需要我从 48 开始按 Enter,第一个 printf 输出很奇怪,它不需要用户按任何键(更不用说 Enter )。它看起来像这样:
24 576
Press Enter to coninue... 25 625
26 676
但是下次代码使用 printf 时,一切似乎都很完美,我需要按 Enter 继续,因为它应该是.. (代码后面的健康输出示例以及所有后续 24 的倍数)。
48 2304
Press Enter to coninue...
49 2401
纠正这个问题的一件事是,如果我在 for 循环中的 printf 和 while 之间放置了一个额外的 getchar() 函数。所以代码完全一样,除了 for 循环现在看起来像这样:
for(i = 1; i <= n; i++) {
if((i - 1) % 24 == 0 && i > 1) {
printf("Press Enter to continue...");
getchar();
while(getchar() != '\n')
;
}
printf("%10d%10d\n", i, i*i);
}
在这种情况下,代码可以完美运行。除了从 48 开始我需要按两次 Enter 键。大概这是因为我已经设置了额外的 getchar() 但是为什么我只需要在 i = 24 时按一次 Enter 呢?
我的猜测是这与(i - 1) % 24 参数有关,但我看不出问题出在哪里。这是 KNK C Programming A Modern Approach 第 7 章中的一个问题。我是一名自学成才的程序员。我希望我的问题易于理解,并且它阐明了关于 C 的一些重要内容。这可以被视为实现定义的行为吗?也许在另一台机器上我所描述的不会发生?如果不是,为什么不呢?
【问题讨论】:
-
scanf()(当您键入"48<ENTER>"时)将输入留在输入缓冲区中。第一个getchar()处理待处理<ENTER>。更喜欢将fgets()专门用于 ALL 用户输入(包括文本文件) -
你为什么要使用
scanf?像这样的参数应该来自argv -
我明白了,被告知 scanf 将输入留在输入缓冲区中是一个键。此外,我只想补充一点,我没有使用过
fgets()或argv,因为书中还没有提到它们。感谢您解决此问题。 -
@tommie997
scanf()不会因为函数而离开'n',而是因为"%d"格式在找到最后一个数字文本字符后停止读取。如果您输入"48<space><blah>",将保留在 stdin。
标签: c