比如说我有以下主要功能:
int main()
{
char a[1023];
while (scanf("%s",a) != EOF)
{
printf("%s ",a);
}
}
如果我输入
a ab abc(newline)
它应输出:
a ab abc(newline)
但主要功能输出
a ab abc (newline) // there is a space between newline and the last string
我想逐个读取字符串。有什么问题,如何删除该空间?谢谢。
答案 0 :(得分:1)
您的printf("%s ",a);
语句在输出的每个字符串后输出一个空格,无论如何。只有在有更多字符串时才需要输出空格。等效(并且更容易),如果不是第一个字符串,则在每个字符串之前输出空格:
int first = 1;
while (scanf("%s",a) != EOF) {
if (!first) printf(" ");
printf("%s",a);
first = 0;
}
另外,尽管将换行描述为输出,但你永远不会输出换行符......
答案 1 :(得分:1)
关于独立学习的一点注意事项:
首次使用任何标准库函数时,至少应阅读相应的手册一次。原因是,只要您了解任何问题(或有用的功能),您就会知道要避免这些问题(或使用有用的功能)。阅读本手册确实可以帮助您充分发挥潜力,避免C的陷阱。
您第一次阅读某些内容时,可能并不完全理解它。不要让那困扰你;继续阅读。如果发生这种情况,我建议您在页面底部再次阅读,并尝试第二次完全理解。请至少阅读一次the fscanf manual。
现在已经不在了。您可能会在这里和那里注意到一些 ^ 上标。我的目的是通过阅读和理解我上面链接的手册来注释你将学到的事实。
格式说明符%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
可能错误的方式来解决问题。您可以通过使用最内层循环的派生来消除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和many other standard things手册。