下面的代码旨在断言一个字符串是否包含某个前缀。 函数prefix
仅在给定的字符串包含前缀pre
时才返回1。for循环中的布尔条件C
/* 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运行它,发现在for循环里面的prefix
函数, 行if (pre[i] != str[i]) return 0;
即使在pre[i] == '\000'
时也被执行。 此时不应满足for循环中的条件,并且最后一次比较不会被执行? 我意识到,将条件从||
更改为&&
确实是我的第一意思,但我不明白为什么,这是我的问题。如何在pre[i] == '\000'
时仍然执行以下条件 pre[i] != '\0' || str[i] != '\0'
?