首页 > 解决方案 > 谁能弄清楚为什么我的将句子拆分为单词的程序(在 C 中)不起作用?

问题描述

我写了两个代码来将句子拆分为单词,其中一个有效,另一个无效。唯一的区别在于 for 循环下的 if 条件。第一个没有输出。而第二个是给出预期的输出。请逻辑解释,不要教德摩根定律。我已经完全应用了我的逻辑,我认为这在第一个代码中也是正确的。

不工作一个:

  #include <stdio.h>
  void main(void){
  int i=0, m=0, n=0, j, l=0;
  char sen[500], wrd[500][500];

  printf("Input a sentence:\n");
  gets(sen);

  while(sen[i]!='\0'){
  l++;
  i++;
  }

  for(i=0;i<=l;i++){
    if(sen[i] != ' '||sen[i] != '\0'){    //Here is the difference.
        wrd[m][n]=sen[i];
        n++;
    }
    else{
        wrd[m][n]='\0';
        puts(wrd[m]);
        printf("\n");
        m++;
        n=0;
    }
    }
}

工作一:

 #include <stdio.h>
 void main(void){
 int i=0, m=0, n=0, j, l=0;
 char sen[500], wrd[500][500];

 printf("Input a sentence:\n");
 gets(sen);

 while(sen[i]!='\0'){
 l++;
 i++;
 }

 for(i=0;i<=l;i++){
    if(sen[i] == ' '||sen[i] == '\0'){        //Here is the difference.
        wrd[m][n]='\0';
        puts(wrd[m]);
        printf("\n");
        m++;
        n=0;

    }
    else{
        wrd[m][n]=sen[i];
        n++;
    }
    }
}

唯一的区别在于for循环的 if 条件。第一个有:if(sen[i] != ' '||sen[i] != '\0') 第二个有:if(sen[i] == ' '||sen[i] == '\0')

标签: cstringfor-loopif-statement

解决方案


您似乎认为条件:

(sen[i] != ' '||sen[i] != '\0')

是以下的逻辑否定:

(sen[i] == ' '||sen[i] == '\0')

事实并非如此。 德摩根定律规定了布尔语句的逻辑等价性。

您想要的一般情况是!(A || B) == (!A && !B). 因此,您可以在分组表达式中移动否定,但逻辑 OR 会变成逻辑 AND,反之亦然。

在您的具体情况下,后一种情况的倒数是:

!(sen[i] == ' ' || sen[i] == '\0')

变成:

(sen[i] != ' ' && sen[i] != '\0')

wrd通过这个讨论,如果两者sen[i]都不是空格 sen[i] 并且不是换行符,您想要追加。wrd相反,您说如果sen[i]不是空格或sen[i] 不是换行符 ,则要追加。任何字符要么不是空格,要么不是换行符,所以这个条件总是成立的。


推荐阅读