【问题标题】:Not able to figure out the logical error in C program无法找出 C 程序中的逻辑错误
【发布时间】:2011-08-26 18:26:37
【问题描述】:

每行打印一个单词的程序。

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;

}

【问题讨论】:

    标签: c logic boolean-logic boolean-expression


    【解决方案1】:

    正确的条件变化是:

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

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

    De Morgan's law

    【讨论】:

    • @che - 谢谢。我想过,但懒得编辑:)
    • 感谢您指出我的错误。我真的很傻。仍然需要学习......
    【解决方案2】:

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

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

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

    char buffer[256];
    
    while (scanf("%255s", buffer))
        printf("%s\n", buffer);
    

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

    【讨论】:

    • 感谢分享程序的问题。我也试试。
    【解决方案3】:

    你需要把||s改成&&s,即改变

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

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

    即"IF c 不等于空格 AND c 不等于 return AND c 不等于 tab THEN ..."

    【讨论】:

      【解决方案4】:

      记住你的逻辑编程课程:

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

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

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

      【讨论】:

        【解决方案5】:

        您可以按照 MByD 所说的去做,或者您可以将您的或 (||) 更改为与 (&&)。

        【讨论】:

          【解决方案6】:

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

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

          你得到:

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

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

          记住:

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2022-09-27
                • 1970-01-01
                • 1970-01-01
                • 2011-02-15
                • 1970-01-01
                • 2017-01-20
                • 1970-01-01
                相关资源
                最近更新 更多