2014-05-15 128 views
2

下面的代码旨在断言一个字符串是否包含某个前缀。 函数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'

回答

2

您正在使用|| ..ie logical or计算结果为true如果任一值是true

所以对条件pre[i] != '\0' || str[i] != '\0',虽然pre[i]='\0'str[i]!='\0'。所以条件评估为true,它进入循环。

你需要使用什么是&& ..ie logical and

简单来说,循环,直到这两个字符串不是 '\ 0',这是由

pre[i] != '\0' && str[i] != '\0'

实现