我通过阅读K& R来学习c。我试图有条不紊地确保在继续之前理解这些概念。
其中一个练习要求编写一个程序,将输入复制到输出"用一个空格替换一个或多个空格的每个字符串。"
我写了以下内容,但即使存在多个连续的空格,它也会逐字输出输入:
#include <stdio.h>
main()
{
int c, d, a;
c = getchar();
while (c != EOF)
{
a = c;
if (c == ' ' && d == ' ')
{
a = 0;
}
d = c;
putchar(a);
c = getchar();
}
}
我在这里做错了什么?我不太喜欢这本书,所以我觉得我错过了一些非常简单的东西...
答案 0 :(得分:2)
评论中有一些好处:
putchar(0)
与不写任何内容不一样我还会提出一个建议:
while
循环应该读取字符并检查EOF,如下所示(假设您有第2版的K&amp; R,请参阅第17页的第1.5.1节以获取详细说明。)
以下是我编写代码的方法:
#include <stdio.h>
int main(void)
{
int c;
int oldc = 'a';
while ( (c=getchar()) != EOF )
{
if (oldc != ' ' || c != ' ')
putchar(c);
oldc = c;
}
}
答案 1 :(得分:1)
我想通了,虽然我对我的解决方案并不完全满意:
%% some code omitted ...
F = fun() -> blah, blah, timer:sleep(10000) end,
f(F), %% like `spawn(F), but doesn't return until 10 seconds has passed`
%% ...
感谢那些评论的人。除了我的逻辑问题,我错误地假设#include <stdio.h>
main()
{
int c, d;
d = 'a';
c = getchar();
while (c != EOF)
{
if (c != ' ')
putchar(c);
if (c == ' ' && d != ' ')
putchar(c);
d = c;
c = getchar();
}
}
与打印零长度字符串相同。
答案 2 :(得分:0)
您的代码中存在问题,因为您在第一次循环运行初始化之前测试d
这是我想出的解决方案。它并不是效率最高的,但我相信它很容易理解,只能在变量c
方面起作用。
#include <stdio.h>
int main(void)
{
int c;
c = getchar();
while(c != EOF)
{
putchar(c);
if(c == ' ') /* If the last character was a space */
{
do /* Then keep getting new characters and overwrite */
{
c = getchar();
} while(c == ' '); /* as long as spaces keep coming */
}
else
c = getchar(); /* if a space wasn't received, then just get the next */
}
return 0;
}
如上所述,一旦程序收到空格,它就会进入一个循环,覆盖C直到找到下一个非空格字符,然后它就会打印出C中的任何内容。