c - 谁能弄清楚为什么我的将句子拆分为单词的程序(在 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')
解决方案
您似乎认为条件:
(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]
不是换行符 ,则要追加。任何字符要么不是空格,要么不是换行符,所以这个条件总是成立的。
推荐阅读
- visual-studio-2017 - 如何将包管理器控制台设置为自动出现
- c# - 在 C# 中禁用预加载的组合框
- javascript - 如何从角度的复杂方法返回 ArrayList()
- java - Apache Ant Java API 未执行所有具有依赖关系的目标
- c# - 如何在 linq 中添加多个 where 子句?
- dart - Flutter - 使用通知向其他小部件发送消息
- ios - 如何设置 iOS 缓存和磁盘存储大小以及如何在应用程序终止后从磁盘存储中恢复缓存?
- c - 在C中将字符数组转换为int是否安全?
- xamarin - 我需要在 XamarinForms 上的日期选择器中阻止粘贴功能
- terraform - Terraform template_file vars 属性得到定义