循环遍历C中的char数组

时间:2018-02-23 02:42:19

标签: c string pointers

我不是C开发人员,也不了解C,但我遇到了这个C面试问题:

int toto(char *a, char *b){
    while(*a++ == *b++);
    return(*a == 0 && *b == 0);
}

我花了很多时间试图解决这个问题,在网上阅读了一些内容后,我有点抓住它想要做的事情,但仍然会出现一些奇怪的行为。 从我的理解(请纠正我,如果我错了),这段代码将通过两个字符串(字符数组)并确定它们是否相等,直到最后一个字符,并且仅当最后一个字符是不同。 return (*a == 0 && *b == 0)检查所有字符串在0中结束的C整数。这只发生在循环退出之后,即两个字符在增量发生之前不相等;所以如果最后两个字符不相等,它会将它们增加到0 int并转到return语句。我还注意到,如果字符串相差1,那么如果字符串等于n-1,它仍然会返回true,例如:

char a[] = "ggr"
char b[] = "ggre"
//returns 1
char a[] = "ggr"
char b[] = "ggf"
//returns 1

我发现这种行为很奇怪,但我无法理解的测试用例如下:

char a[] = "abcd";
char b[] = "abcd";
//returns 1
char a[] = "abc"
char b[] = "abc"
//returns 0

我理解为什么abc返回false但我不知道为什么它不会为abcd返回相同的内容。对我而言,似乎它对不同长度的字符串的处理方式不同,但代码似乎并不关心长度。

任何人都可以解释代码打算做什么以及为什么在给定不同长度的字符串时代码的行为会有所不同。我觉得它与某些运营商的优先顺序有关,但我找不到答案。

编辑:面试中提供的代码似乎是故意的,我认为代码是有效的。

2 个答案:

答案 0 :(得分:8)

您的代码有未定义的行为。它最终将访问空终止char数组之外的内存。从这个意义上说,这段代码是错的。

正确的实现类似于

int toto(char *a, char *b){
    while(*a && *b && *a == *b) a++,b++;
    return (*a - *b)?0:1;
}

答案 1 :(得分:4)

因为它有一个bug。如果两个字符串完全相等,直到任一字符串的结尾,那么您将迭代超过字符串的结尾。然后,您将有未定义的行为,这意味着有时它可以工作,或者有时它可能崩溃(或做许多其他事情)。考虑将此添加到您的函数中:

int counter = 0;
while(*a++ == *b++) {
    printf("Count %d\n", ++counter);
}

Live example

你会注意到它可以打印:

Count 1
Count 2
Count 3
Count 4

这意味着您的返回行(return(*a == 0 && *b == 0);)将取消引用超出字符串结尾(即第5个字符串字符)。