-1

比如说我有以下主要功能:

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

我想一一阅读字符串。有什么问题,如何删除该空间?谢谢你。

4

2 回答 2

1

关于自主学习的一点注意事项:

第一次使用任何标准库函数时,应至少阅读其相应的手册一次。原因是一旦您知道任何问题(或有用的功能),您就会知道如何避免这些问题(或使用有用的功能)。阅读手册确实可以帮助您了解 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);
}

从这个循环的长度和问题的简单性来看,您可能会认为使用scanffor this 可能是解决问题的错误方法。您可以通过使用最内层循环的派生来消除line数组、对的调用scanf和由此产生的错误检查。scanf像这样的东西看起来不错:

#include <stdio.h>

int main(void) {
    int c;
    do {
        c = getchar();
    } while (c >= 0 && putchar(c) >= 0 && c != '\n');
}

PS。还有一本getcharputchar许多其他标准东西的手册。

于 2013-07-31T00:23:59.417 回答
1

无论如何,您的printf("%s ",a);语句在它输出的每个字符串之后都会输出一个空格。只有当有更多字符串时,您才需要输出一个空格。等效地(并且更容易),如果不是第一个字符串,则在每个字符串之前输出一个空格:

int first = 1;
while (scanf("%s",a) != EOF) {
    if (!first) printf(" ");
    printf("%s",a);
    first = 0;
}

此外,尽管将换行描述为正在输出,但您永远不会输出换行...

于 2013-07-30T20:56:01.107 回答