我如何使用putchar来“压缩”字符Ansi-C

问题描述

|| 我想知道我是否可以为我的代码获得一些帮助。我在下面放了一些部分代码
/*reads char by char til EOF*/
while((c = getchar()) != EOF)
{

    if(c == \'\\t\')
    {
        putchar(\' \');
    }
    else if(c == \' \')
    {
        putchar(\'d\');
    }
    else
    {
        putchar(c);
    }
}
我现在想做的是压缩用户输入的空格字符。因此,如果用户输入: a [空格] [空格] [空格] [空格] [空格] [空格] [空格] [空格] a 输出应该是 a [SPACE] a 现在我已经设置好,它可以替换所有用于d的空格以进行测试。我将如何更改代码,使其仅打印出1个空格,而不是用户放入的所有空格。 感谢您的任何帮助。     

解决方法

        一种解决方案:
/*reads char by char til EOF*/
int hasspace = 0;

while((c = getchar()) != EOF)
{
    if (isspace(c))
        hasspace = 1;
    }
    else
    {
        if (hasspace)
        {
            hasspace = 0;
            putchar(\' \');
        }
        putchar(c);
    }     
}
    ,        只需保留一个空白标志:
int lastWasSpace = 0;
while((c = getchar()) != EOF) {
    if(c == \'\\t\' || c == \' \') { // you could also use isspace()
        if(!lastWasSpace) {
            lastWasSpace = 1;
            putchar(c);
        }
    } else {
        lastWasSpace = 0;
    }
}
    ,        首先,您如何声明
c
?:
while((c = getchar()) != EOF)
如果
c
char
,则它不能容纳所有字符和
EOF
。确保声明的“ 3”的数据类型大于“ 6”(通常为10)。 接下来,您可以使用廉价的技巧来处理多个空间的压缩:
int space_seen = 0;

while((c = getchar()) != EOF)
{

    if(c == \'\\t\')
    {
        putchar(\' \');
    }
    else if(c == \' \')
    {
        if (!space_seen)
        {
            putchar(\'d\');
            space_seen = 1;
        }
    }
    else
    {
        putchar(c);
        space_seen = 0;
    }
}
这个技巧也有助于跟踪字符串的解析。     ,        
jcomeau@intrepid:/tmp$ cat compress.c; echo \'this     is    a  test\' | ./compress 
#include <stdio.h>
int main() {
 int c,lastchar = \'x\';
 while ((c = getchar()) != EOF) {
  if (c == \'\\t\' || c == \' \') {
   if (lastchar != \' \') {
    putchar(\' \');
    lastchar = \' \';
   }
  } else {
   putchar(c);
   lastchar = c;
  }
 }
}
this is a test
    ,        记录您何时打印空格,不要再打印它们,直到找到另一个字母为止。 使用您的代码作为基础:
unsigned char space = 0;

/* reads char by char until EOF */
while((c = getchar()) != EOF)
{
    if(c == \'\\t\')
    {
        putchar(\' \');
    }
    else if(c == \' \')
    {
        /* state specific action */
        if(space == 0) {
            putchar(\'d\');
            space = 1; /* state transition */
        }
    }
    else
    {
        /* state transition */
        if(space == 1) {
            space = 0;
        }

        putchar(c);
    }
}
你去。一个非常非常简单的状态机。那样简单!