以下代码旨在断言字符串是否包含特定前缀。
仅当给定的字符串包含前缀prefix
时,函数pre
才返回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;
}
编译并运行后,assert (errCode == 1)
失败。
我通过gdb运行它,并在prefix
函数内的for循环中找到它,
即使if (pre[i] != str[i]) return 0;
,也会执行第pre[i] == '\000'
行。
在这一点上不应该满足for循环中的条件,并且最后的比较不会被执行?
我意识到将for条件从||
更改为&&
就行了我的意思,但我不明白为什么,这是我的问题。怎么会出现以下情况
pre[i] != '\0' || str[i] != '\0'
时仍会执行pre[i] == '\000'
?
答案 0 :(得分:2)
您正在使用||
..即logical or
,如果其中任何一个值为true
true
因此对于条件pre[i] != '\0' || str[i] != '\0'
,pre[i]='\0'
,str[i]!='\0'
。因此条件评估为true
并进入循环。
您需要使用的是&&
..即logical and
简单来说,循环直到两个字符串都不是'\ 0',这是通过
实现的 pre[i] != '\0' && str[i] != '\0'