循环C中的布尔条件
以下代码用于断言字符串是否包含某个前缀。 仅当给定的字符串包含前缀循环C中的布尔条件,c,boolean-logic,C,Boolean Logic,以下代码用于断言字符串是否包含某个前缀。 仅当给定的字符串包含前缀pre时,函数prefix才会返回1 /* preprocessor directives */ #include <stdlib.h> #include <assert.h> /* prototypes */ int prefix(char * pre, char * str); int main() { /* declaration / initialization */ char
pre
时,函数prefix
才会返回1
/* preprocessor directives */
#include <stdlib.h>
#include <assert.h>
/* prototypes */
int prefix(char * pre, char * str);
int main() {
/* declaration / initialization */
char pre[] = "Hell", str1[] = "Hello!", str2[] = "hi!";
int errCode = prefix(pre, str1);
/* processing */
assert (errCode == 1);
errCode = prefix(pre, str2);
assert (errCode == 0);
errCode = prefix(NULL, str2);
assert (errCode == 0);
errCode = prefix(pre, NULL);
assert (errCode == 0);
/* termination */
return 0;
}
/* Returns 0 if pre or str is NULL or if pre is not a prefix of str.
* Otherwise returns 1.
*/
int prefix(char * pre, char * str) {
/* declaration / initialization */
int i;
/* processing */
if (pre == NULL || str == NULL) return 0;
for (i = 0; pre[i] != '\0' || str[i] != '\0'; i++)
if (pre[i] != str[i]) return 0;
if (pre[i] != '\0') return 0;
/* termination */
return 1;
}
/*预处理器指令*/
#包括
#包括
/*原型*/
int前缀(char*pre,char*str);
int main(){
/*声明/初始化*/
char pre[]=“地狱”,str1[]=“你好!”,str2[]=“你好!”;
int errCode=前缀(pre,str1);
/*加工*/
断言(errCode==1);
errCode=前缀(pre,str2);
断言(errCode==0);
errCode=前缀(空,str2);
断言(errCode==0);
errCode=前缀(pre,NULL);
断言(errCode==0);
/*终止*/
返回0;
}
/*如果pre或str为NULL或pre不是str的前缀,则返回0。
*否则返回1。
*/
int前缀(char*pre,char*str){
/*声明/初始化*/
int i;
/*加工*/
if(pre==NULL | | str==NULL)返回0;
对于(i=0;pre[i]!='\0'| | str[i]!='\0';i++)
如果(pre[i]!=str[i])返回0;
if(pre[i]!='\0')返回0;
/*终止*/
返回1;
}
编译并运行后,assert(errCode==1)
失败。
我通过gdb运行它,发现在for循环的prefix
函数中,
行if(pre[i]!=str[i])返回0即使在pre[i]='\000'
时也会执行code>。
此时是否应该满足for循环中的条件,并且不执行最后一次比较??
我意识到将for条件从|
更改为&&
符合我最初的意思,但我不明白为什么,这是我的问题。为什么会出现以下情况
pre[i]!='\0'| | str[i]!='\当您使用|
时,pre[i]='\000'
?仍将执行0'
。即逻辑或
,如果其中任何一个值为真
所以对于条件pre[i]!='\0'| | str[i]!='\0'
,尽管pre[i]='\0'
,str[i]!='\0'
。因此,条件的计算结果为true
,并进入循环
您需要使用的是和&
。即逻辑和
简单来说,循环直到两个字符串都不是“\0”,这是通过
pre[i]!='\0'&&str[i]!='\0'