我目前正在学习/重新学习C.去年在学校学习它时遇到了一些麻烦。我正在使用一本书,其中一个练习要求获得过多的空间并将它们变成一个空间。问题是我无法识别标签。我已经在这里寻找了一些,但它们都处理数组。我不能使用数组。这就是我到目前为止所拥有的。
int main()
{
int c;
c = getchar();
while (c != EOF)
{
if (c == ' ')
{
putchar(c);
for (c = getchar(); c == ' '; c = getchar())
;
}
else if (c == '\t')
putchar(' ');
putchar(c);
c = getchar();
}
}
所以基本上,代码从获取char值并将其放入“c”开始。那么当c不是EOF时,如果c等于SPACE的ASCII值,它将输出它并输入for循环。 for循环测试其他空间。 c等于下面的char,而c等于SPACE的ASCII值,for循环将不执行任何操作,它将迭代直到所有其他空格都消失。顺便说一句,if语句完美地运行。
然后我进入其他地方,如果我确定是错的,但这是我最近的尝试。所以对于这个,我说如果c等于tab的ASCII值(这是一个什么东西?如果不是那可能是我的错误)通过使用putchar('')放下一个空格。我觉得这个命令也可能是错的。在该语句之后它退出条件,输出值然后c现在等于一个新的char并且循环继续。
谢谢!
编辑:所以在发布之后我意识到,至少我认为,我的错误是底部的putchar(c)仍然打印出标签而不管?虽然我仍然不确定如何处理这个问题。还有一件事是这些是我可以使用的唯一命令。这本书仍然假设我还不知道数组和C中的工作方式。答案 0 :(得分:0)
虽然对后续空格/标签的处理方式有点不清楚,但请考虑只保存以前的字符。
int previous = EOF;
int ch;
while ((ch = fgetchar()) != EOF) {
if (ch == '\t') { // or if (isblank(ch)) ...
ch = ' ';
}
if (previous != ' ') {
putchar(ch);
}
previous = ch;
}