1

我正在编写一些简单的 c 编程代码,用一个空格替换一串多个空格。我的代码如下,但它显然包含错误。我试图避免使用数组或指针。那么关于如何纠正我的错误有什么建议吗?

#include <stdio.h>
int main(void)
{
    int c,d;
    d=0;
    while((c=getchar())!=EOF)
        {
        if (c==' ')
            {
                d=getchar();
                if (d!=' '&&d!=EOF)
                    putchar(c);
            }
        putchar(c);
        }
}
4

8 回答 8

3

在进行这种过滤时,永远不要重复读取输入通常是一个好主意,因为这往往会分散逻辑。至少根据我的经验,我发现如果我在一个地方读取输入然后处理它会更容易。

对于这个问题,一个简单的状态机就足够了:只要记住最后一个字符是否为空白,并且仅在读取的最后一个字符不是空白时才输出空白。

于 2013-06-04T14:08:53.200 回答
2

第一:避免使用getchar, putchar。使用getc,putc代替。

如果您非常想逐个字符地阅读,那么可以这样做:

int c, lastc = '\0';
while((c = getc(stdin)) != EOF) {
    if (c == ' ' && lastc == ' ')
        continue;
    putc(c, stdout);
    lastc = c;
}
于 2013-06-04T14:08:00.970 回答
1

使用标志来记住您是否阅读了空白:

#include <stdio.h>

int main( void )
{
  int lastBlank = 0;
  int c;

  while ( (c = fgetc( stdin )) != EOF )
  {
    if ( c != ' ' || !lastBlank )
      fputc( c, stdout );

    lastBlank = ( c == ' ' );
  }
  return 0;
}
于 2013-06-04T15:06:03.253 回答
1
#include <stdio.h>

/*copy input to output, replacing each 
string of one or more blanks by a single blank.*/

main() {

    int c;

    while((c =getchar()) != EOF) {
        if (c!= ' ') 
            putchar(c);
        else {
            putchar(c);
            while((c =getchar()) == ' ');
            putchar(c);
        }
    }
}
于 2017-12-20T19:42:36.517 回答
0
#include<stdio.h>

int nextChar(FILE *fp){
    static int buff = 0;
    int ch = fgetc(fp);
    if(buff != ch)
        buff = ch;
    else
        while(buff == ' ')
            buff = fgetc(fp);
    return buff;
}

int main(void){
    FILE *fp = stdin;
    int ch;
    while(EOF!=(ch=nextChar(fp))){
        putchar(ch);
    }
    return 0;
}
于 2013-06-04T14:56:15.457 回答
0

这段代码似乎工作正常:

#include <stdio.h>

int main(void)
{
    int c, d;
    d = 0;
    while ((c = getchar()) != EOF)
    {
        if (c == ' ')
        {
            while ((d = getchar()) == ' ');
            putchar(c);
            putchar(d);
        } else {
            putchar(c);
        }
    }
}
于 2013-06-04T14:08:21.753 回答
0
# include <stdio.h>

int main(){

  int c , n;
    n=0;

    while((c=getchar())!= EOF) {
        if (c == '\t') {

            if (n<1){
                putchar('\t');
                n=n+1;
            }
        }
        else {
            n=0;
            putchar(c);
        }
    }
}
于 2016-11-07T07:38:18.750 回答
0
#include <stdio.h>

int main() {
    int c;

    while((c = getchar()) != EOF) {
        if (c != ' ')
            putchar(c);
        if (c == ' ') {
            // if we found a blank continue reading
            // searching for additional blanks
            // put one blank char to output stream
            // put the char that casue the while loop to exit
            while((c = getchar()) == ' ');
            putchar(' ');
            putchar(c);
        }
    }
}

使用包含不同数量空白的简单文件进行测试会产生正确的行为

➜  course-c cat data
one space two  spaces three   spaces four   spaces five     spaces


➜  course-c ./replace.blank < data
one space two spaces three spaces four spaces five spaces
于 2020-05-06T23:19:52.953 回答