以下代码旨在断言字符串是否包含特定前缀。
仅当给定的字符串包含前缀 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;
}
编译运行后,assert (errCode == 1)
失败。
我通过 gdb 运行它并发现在 prefix
函数内的 for 循环中,
即使 pre[i] == '\000'
也会执行 if (pre[i] != str[i]) return 0;
行。
此时是否应该满足 for 循环中的条件并且不执行最后一次比较?
我意识到将 for 条件从 ||
更改为 &&
符合我最初的意思,但我不明白为什么,这是我的问题。怎么会出现下面的情况
pre[i] != '\0' ||当
仍然执行吗?pre[i] == '\000'
时 str[i] != '\0'
最佳答案
您正在使用||
..即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'
关于c - for循环C中的 bool 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23682317/