带有" getchar / putchar"的程序它采用文本行并从新行打印每个句子

时间:2017-10-05 12:50:22

标签: c

我试图使用getchar / putchar运算符编写一个简单的程序。它必须以行显示文本并将其打印出新行的每个句子。

我写了这段代码,但它对我来说意外,例如我写了

"I can't program. Help me. Please."

打印出来:

I can't program.
. Help me.
. Please.

为什么它重复"。" ??? 我的代码是:

#include <stdio.h>
#include <stdio.h>


int main(void) {
    int stop=0;
    int i;
    printf("enter your text:  ");
    while((i=getchar())!=EOF){
        if(i=='.')
        {
            stop=1;
            putchar(i);
            putchar('\n');
        }
        if(i==' ')
        {
            if(stop==0) putchar(i);
        }

        else if(i!=' '||i!='.')
        {
            putchar(i);
            stop=0;
        }
    }
    return 0;
}

提前谢谢。

2 个答案:

答案 0 :(得分:1)

但重新格式化有助于理解错误

if(i == '.') {
    stop = 1;                        // part A
    putchar(i);
    putchar('\n');
}

if(i == ' ') {
    if(stop == 0) {                 // Part B
        putchar(i);
    }
} else if(i != ' ' || i != '.') {
    putchar(i);                     // Part C
    stop = 0;
}

当char i包含点时,

  • 执行A部分(并打印点)
  • 对太空的测试失败
  • 然后执行else部分

在else部分,测试总是成功,因为你写了一个&#34;或&#34;而不是&#34;和&#34;。因此,点再次打印

如何解决问题:在您的问题中有3种情况(点,空格,其他),您应该避免两次表达相同的比较。

可能性是一系列if / else-if /...

if (i == '.') {
     //  process dot
} else if (i == ' ') {
     // process space
} else {
    // process other
}

更好的解决方案是使用开关

switch (i) {
case '.':
      // process dot
      break;
case ' ':
      // process space
      break;
default:
      // process other
      break;
}

答案 1 :(得分:0)

此:

else if(i!=' '||i!='.')

毫无意义,你的意思是

else if(i != ' ' && i != '.')