我想知道我是否可以为我的代码获得一些帮助。我在下面放了一些部分代码
/*reads char by char til EOF*/
while((c = getchar()) != EOF)
{
if(c == '\t')
{
putchar(' ');
}
else if(c == ' ')
{
putchar('d');
}
else
{
putchar(c);
}
}
我现在要做的是挤压用户输入的空格字符。因此,如果用户输入:
一个[SPACE] [SPACE] [SPACE] [SPACE] [SPACE] [SPACE] [SPACE] [SPACE]一个
输出应该只是
一个[SPACE]一个
现在我已经设置它为了测试目的而替换了d的所有空格。我如何更改我的代码,以便它只打印1个空格而不是用户放入的所有空格。
感谢您提前提供任何帮助。
答案 0 :(得分:4)
只留一个空白旗帜:
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;
}
}
答案 1 :(得分:3)
一个解决方案:
/*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);
}
}
答案 2 :(得分:2)
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
答案 3 :(得分:2)
首先,您如何宣布c
?:
while((c = getchar()) != EOF)
如果c
是char
,则无法将所有字符和保存为EOF
。请确保声明c
的数据类型大于char
(通常为int
)。
接下来,您可以使用廉价技巧处理多个空格:
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;
}
}
这个技巧也适用于跟踪解析字符串。
答案 4 :(得分:1)
在您打印空格时进行记录,在找到另一个字母之前不要打印它们。
使用您的代码作为基础:
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);
}
}
你去吧。一个非常非常简单的状态机。这很容易!