忽略使用 fgets 时的额外空格

3
我正在使用fgets和stdin读取一些数据,最大长度为25。在我运行此代码的一个测试中,我想要的数据后面有几百个空格,这会导致程序失败。
有人能告诉我如何在使用fgets时忽略所有这些额外的空格并转到下一行吗?
3个回答

2
使用 fgets() 迭代读取字符串,然后扫描该字符串以查看是否全部为空格(以及是否以换行符结尾),如果是则忽略它。或者改用循环中的 getc()getchar()
char buffer[26];

while (fgets(buffer, sizeof(buffer), stdin) != 0)
{
    ...process the first 25 characters...
    int c;
    while ((c = getchar()) != EOF && c != '\n')
        ;
}

这段代码会忽略所有字符直到下一个换行符。如果你想确保它们是空格,可以在(内部)循环中添加一个测试,但你必须决定如果字符不是空格要做什么。


我希望有一种方法可以使用getchar()忽略所有的空格。我尝试过这样做:while( (ch = getchar()) != '\n' && (int)ch != EOF );但是这导致了一个无限循环。 - Gary
请注意,我将 c 声明为一个 int 而不是一个 char;在换行符之前测试了 EOF,尽管如果您将其分配给一个 int 而不是一个 char,它也可以以另一种方式工作。请记住,函数(宏)getc()getchar() 返回的是整数而不是 char。任何被告知三次的事情都是真的。 - Jonathan Leffler

0

解释Jonathan Leffler关于getc()的建议:

我假设你有一个像这样的循环:

while (!feof(stdin)) {
  fgets(buf, 25, stdin);
  ...
}

将它改成这样:

while (!feof(stdin)) {
  int read = fgets(buf, 27, stdin);
  if (read > 26) { // the line was *at least* as long as the buffer
    while ('\n' != getc()); // discard everything until the newline character
  }
  ...
}

编辑:啊,Jonathan 写 C 的速度比我快。:)


1
记住getc()需要一个文件指针(假设是stdin),而getchar()则默认使用stdin。另外要注意EOF - 如果文件中没有剩余的换行符,你的内部循环将不会停止。 - Jonathan Leffler

0

尝试使用以下代码,以去除字符串末尾的空格。

 char str[100] ;
    int i ;
    fgets ( str , 80 , stdin ) ;
    for ( i=strlen(str) ; i>0 ; i-- )
    {
            if ( str[i] != ' ' )
            {
                    str[i+1]='\0';
                    break ;
            }
    }

使用 sizeof(str) 而不是 80。 - Jonathan Leffler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接