2011-05-16 69 views
5

一个程序在每行输出一个字的输入。无法计算出C程序中的逻辑错误

int main() { 

    int c; 

    while ((c=getchar()) != EOF) { 

     if (c== ' ' || c== '\n' ||c == '\t') 
       putchar('\n'); 
     else { 
      putchar(c); 
     } 
    } 
    return 0; 
} 

上述程序正确输出结果,每行一个字。在相应地改变条件之后,我期待下面的程序每行打印一个字。但是我没有得到正确的结果。我犯了一些愚蠢的错误还是错了?

int main() { 

    int c; 

    while ((c=getchar()) != EOF) { 

     if (c != ' ' || c != '\n' || c != '\t') 
      putchar(c); 
     else { 
      putchar('\n'); 
     } 
    } 

    return 0; 

} 

回答

16

的条件正确的变化是:

if (!(c == ' ' || c == '\n' || c == '\t')) 

if (c != ' ' && c != '\n' && c != '\t') 

De Morgan's law

+2

+1链接到德摩根定律 – 2011-05-16 20:59:58

+0

@ Paul R.和匿名 - 谢谢;) – MByD 2011-05-16 21:03:42

+0

@谢 - 谢谢。我想过,但懒得编辑的:) – MByD 2011-05-16 21:05:46

3

您需要更改|| s到&& S,即改变

 if (c != ' ' || c != '\n' || c != '\t') 

 if (c != ' ' && c != '\n' && c != '\t') 

即“如果C不等于空间和C不等于返回和C不等于选项卡,然后......”

1

你可以做什么MByD说,或你可以改变你的(||)和(& &)。

0

错误出现在您的条件表达式中。当你否定第一个表达式

!(c== ' ' || c== '\n' ||c == '\t') 

你:

c!= ' ' && c!= '\n' &&c != '\t' 

,而不是你在你的问题中定义。

记住:

(A & & B)是相同的(!甲|| B)

0

A or B or C相反的是not A and not B and not C,所以使用:

if(c != ' ' && c != '\n' && c != '\t') 
2

记住您的逻辑编程类:

!(A || B) == (!A && !B) 
!(A && B) == (!A || !B) 

换句话说:你的病情需要这样写:

if (c != ' ' && c != '\n' && c != '\t') 
0

你需要多学习一点上DeMorgan's Laws。仅将组合运算符从“||”改为“到“& &”,您还必须否定所有要组合的元素才能获得相同的解决方案集。

4

你已经得到了许多你原来的问题的答案,但我觉得有必要添加一个小的细节:原来的和修改后的版本都会遇到一些我认为会遇到的问题。首先,它们没有正确检测到空白区域(例如,它们忽略垂直制表符以及区域设置定义的任何其他空白区域),并且如果单词由多个空格字符分隔,则它们会生成空行。

对于第一个问题,我使用isspace而不是直接比较你所知道的空白字符(顺便说一句,消除你遇到的问题的根源)。对于第二种情况,可以添加一些逻辑以在遇到第一个时跳过所有连续的空格字符,或者当且仅当当前字符是空格时,您可以添加标记以写出新行你写的前一个字符不是新行。

或者,你可以使用scanf%s转换读单词:

char buffer[256]; 

while (scanf("%255s", buffer)) 
    printf("%s\n", buffer); 

然而这种方法,规定了一个字的大小的上限。在正常情况下,这很少有问题,但取决于输入的性质,它可以/可以。

+0

感谢与程序员分享问题。我也会尝试。 – bornfree 2011-05-17 05:54:25