关于自主学习的一点注意事项:
第一次使用任何标准库函数时,应至少阅读其相应的手册一次。原因是一旦您知道任何问题(或有用的功能),您就会知道如何避免这些问题(或使用有用的功能)。阅读手册确实可以帮助您了解 C 语言的全部潜力并避免陷阱。
第一次阅读的时候,你可能并不完全理解它。不要让这困扰你;继续阅读。如果发生这种情况,我建议您在页面底部再次阅读它,并尝试第二次完全理解它。请至少阅读一次fscanf 手册。
现在不碍事了。您可能会注意到这里和那里的小^上标。我的目的是注释您通过阅读和理解我上面链接的手册会学到的事实。
格式说明%s
符在尝试使用尽可能多的非空白字符之前会丢弃尽可能多的空白字符^。假设您要输入带有四个前导字节空白的内容,您的输出将不会有这四个前导字节的空白。
"This uses four spaces" translates to "This uses four spaces".
这违反了您的程序规范,这似乎是合乎逻辑的,这会扩展您的问题^。也许您应该使用%[
格式说明符,而不是^。在这种情况下,空行将被视为匹配失败,并且该行的目的地将是不确定的,因此您需要处理scanf
更好的^的返回值(无论如何我鼓励您这样做)。
#include <stdio.h>
int main(void) {
char line[512];
int x;
do {
x = scanf("%511[^\n]", line);
if (x == 0) {
/* Match failure caused by inputting an empty line. Print empty line? */
putchar('\n');
}
else if (x == 1) {
/* Success. */
puts(line);
}
/* Read and discard the remainder of a line */
do { x = getchar(); } while (x >= 0 && x != '\n');
} while (x != EOF);
}
从这个循环的长度和问题的简单性来看,您可能会认为使用scanf
for this 可能是解决问题的错误方法。您可以通过使用最内层循环的派生来消除line
数组、对的调用scanf
和由此产生的错误检查。scanf
像这样的东西看起来不错:
#include <stdio.h>
int main(void) {
int c;
do {
c = getchar();
} while (c >= 0 && putchar(c) >= 0 && c != '\n');
}
PS。还有一本getchar、putchar和许多其他标准东西的手册。