无法弄清楚C程序中的逻辑错误

时间:2011-05-16 20:53:36

标签: c logic boolean-logic boolean-expression

每行输入一个单词的程序。

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;

}

8 个答案:

答案 0 :(得分:16)

条件的正确变化是:

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

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

请参阅De Morgan's law

答案 1 :(得分:4)

您已经获得了原始问题的一些答案,但我觉得有必要添加一个小细节:原始版本和修改版本都会遇到一些我认为有问题的问题。首先,他们没有真正正确地检测到空白区域(例如,它们忽略了垂直标签,以及区域设置定义的任何其他空白区域),如果单词被多个白色分隔,它们会产生空行 - 空间角色。

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

或者,您可以使用scanf转换使用%s阅读文字:

char buffer[256];

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

然而,这种方法对单个单词的大小施加了上限。在正常情况下,这很少出现问题,但取决于输入的性质,它可以/可以。

答案 2 :(得分:3)

您需要将||更改为&& s,即更改

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

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

即。 “如果c不等于空格而且c不等于返回,而且c不等于制表符那么......”

答案 3 :(得分:2)

记住你的逻辑编程课程:

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

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

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

答案 4 :(得分:1)

你可以做MByD所说的,或者你可以将你的或(||)改为和(&&)。

答案 5 :(得分:0)

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

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

你得到:

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

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

记住:

(A&& B)与(!A ||!B)

相同

答案 6 :(得分:0)

A or B or C相反的是not A and not B and not C,因此请使用:

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

答案 7 :(得分:0)

您需要在DeMorgan's Laws上学习更多内容。从“||”更改组合运算符是不够的对于“&&”,你还必须否定所有被组合的元素以获得相同的解决方案集。