c - 遍历 C 中的 char 数组

标签 c string pointers

我不是 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/

相关文章:

c++ - 从管道读取输入时出现 scanf 问题

c - 为什么会发生字节溢出以及它们的作用是什么?

c - pthread和select()函数的作用是什么?

java - 返回包含字符串形式整数的字符串数组,用文本字符串替换某些数字的倍数

C strncpy 没有空终止的原因

c++ - 将 char 数组分配给单个 char 的奇怪行为

c - 为什么 GCC 警告不要进行这种隐式转换?

c - 数组的所有元素中都存储相同的字符串

c++ - 如何在继承类中创建一个父类变量数组作为私有(private)成员

c++ - 使用数组 : It's crashing on run-time 的单链表