我不是 C 开发人员,也不了解 C,但我遇到了这个 C 面试问题:
int toto(char *a, char *b){
while(*a++ == *b++);
return(*a == 0 && *b == 0);
}
我花了很多时间试图弄明白,在网上阅读了一些东西后,我有点明白了它试图做什么,但仍然出现了一些奇怪的行为。
据我了解(如果我错了请纠正我),这段代码将遍历两个字符串(字符数组)并确定它们是否相等直到最后一个字符并且仅当最后一个字符不同时才返回 true 。 return (*a == 0 && *b == 0)
检查所有字符串以 C
结尾的 0
整数。这只发生在循环退出之后,即当两个字符在增量发生之前不相等时;所以如果最后两个字符不相等,它会将它们递增到 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
返回相同的值。对我来说,它似乎以不同的方式处理不同长度的字符串,但代码似乎并不关心长度。
任何人都可以解释代码打算做什么,以及为什么在给定不同长度的字符串时代码的行为不同。我感觉这与某些运算符的优先顺序有关,但我找不到答案。
编辑:面试提供的代码似乎是故意的,我以为代码是有效的。
最佳答案
您的代码有未定义的行为。它最终将访问空终止 char
数组之外的内存。从这个意义上说,这段代码是错误的。
正确的实现应该是这样的
int toto(char *a, char *b){
while(*a && *b && *a == *b) a++,b++;
return (*a - *b)?0:1;
}
关于c - 遍历 C 中的 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48940303/