在C中循环通过字符数组

在C中循环通过字符数组,c,string,pointers,C,String,Pointers,我不是一名C开发人员,也不太了解C,但我遇到了一个C面试问题: int toto(char *a, char *b){ while(*a++ == *b++); return(*a == 0 && *b == 0); } 我花了很多时间试图弄明白,在网上读了一些东西后,我有点明白了它想做什么,但仍然有一些奇怪的行为出现。 根据我的理解(如果我错了,请纠正我),这段代码将遍历两个字符串(字符数组),并确定它们在最后一个字符之前是否相等,并且仅当最后一个字符不同时才

我不是一名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,但我不知道为什么
abc
不会返回相同的值。对我来说,它似乎以不同的方式对待不同长度的字符串,但代码似乎并不关心长度

有人能解释一下代码打算做什么,以及为什么当给定不同长度的字符串时,代码的行为会不同吗。我觉得这与某些运算符的优先顺序有关,但我找不到答案


编辑:看来面试提供的代码是故意有缺陷的,我的印象是代码是有效的。

您的代码有未定义的行为。它最终将访问以null结尾的
char
数组之外的内存。从这个意义上讲,这个代码是错误的

正确的实现类似于

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

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

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

您会注意到它可以打印:

Count 1
Count 2
Count 3
Count 4

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

这段代码太糟糕了。循环后的检查几乎保证每次都是一个未定义的操作。用调试器或纸笔逐步检查测试用例。这不是魔法。在最后一个字符中完全相同或不同。增量是无条件的,直到任何一个字符串的末尾都包含此值为止。