我正在阅读K& R,问题是:编写一个程序将其输入复制到其输出中,用一个空格替换一个或多个空格的每个字符串。在我看来,我想我知道我需要做什么,设置一个布尔值来知道我什么时候在一个空间。我尝试过但没有成功。我发现这个代码并且它有效,我正在努力弄清楚是什么阻止了空间被写入。我想我可以拥有它,但我需要澄清。
#include <stdio.h>
int main(void)
{
int c;
int inspace;
inspace = 0;
while((c = getchar()) != EOF)
{
if(c == ' ')
{
if(inspace == 0)
{
inspace = 1;
putchar(c);
}
}
/* We haven't met 'else' yet, so we have to be a little clumsy */
if(c != ' ')
{
inspace = 0;
putchar(c);
}
}
return 0;
}
我已经创建了一个文本文件,文本内容如下:
so this is where you have been
在'this'上's'后,状态变为1,因为我们在一个空间中。空间被写入并读取下一个空格。现在我们输入:
while((c = getchar()) != EOF)
{
if(c == ' ')
{
if(inspace == 0)
{
inspace = 1;
putchar(c);
}
但是inspace不是0,它是1.那么会发生什么?代码是否跳过返回0;,没有写任何东西而只是继续while循环?返回0;在循环之外,但这是我唯一能看到不返回值的方法。
答案 0 :(得分:5)
此时:
if(c == ' ')
{
if(inspace == 0) // <-- here
如果inspace等于1,它将不会执行if主体,它将跳转到:
if(c != ' ') {
只要上面的c ==''将为false,那么它将跳过if body并跳转到:
while((c = getchar()) != EOF) {
这将持续到文件结尾或直到(c != ' ')
评估为true。当c是非空格时:
if(c != ' ')
{
inspace = 0;
putchar(c);
将空格置零,并打印字符。
答案 1 :(得分:0)
是的,在你提到的情况下,它没有写任何内容并继续在while循环中并获取下一个字符。如果下一个字符再次是空格,那么它将做同样的事情,即进行下一次迭代而不打印。每当它找到第一个非空格时,它会将空间设置为0并开始打印。
当getchar获取EOF时,循环将终止。然后程序将返回0。
答案 2 :(得分:0)
如果if语句中的条件不为true,则不执行以下表达式。这意味着跳过相应括号内的所有内容,并在结束括号后“继续执行”。
由于以下if语句也是false,因此在for循环的迭代中没有任何操作。
答案 3 :(得分:0)
当inspace为1且c为''表达式时:
inspace == 0
评估为0和代码
inspace = 1;
putchar(c);
未执行。
如果可以,程序将转到while循环的下一次迭代,但是在while循环结束之前它不会返回0。
您可以简化此代码的while循环:
while((c = getchar()) != EOF)
{
if(c == ' ')
{
if(inspace == 0)
{
inspace = 1;
putchar(c);
}
} else
{
inspace = 0;
putchar(c);
}
}