为什么此代码无法正常工作? 这是K&R练习 5-3
char str[20]= "Hello world";
char str2[5] = "xxx";
int main(void) {
strcat(str, str2);
printf("%s", str);
return 0;
}
void strcat(char *s, char *a) {
while (*s++);
while (*s++ = *a++);
}
答案 0 :(得分:4)
这是因为while(*s++);
仍然会递增s
,即使它在退出下一条语句之前命中了NULL字符串终止符。试试:
while (*s) {
s++;
}
当s
变为NULL时,s
不会递增。这样,a
的第一个字符可以覆盖s
的NULL终止符。
后缀递增/递减具有较高的优先级,但是操作数的实际递增或递减被延迟(在语句完成执行之前的某个时间完成)。所以在语句y = x * z ++; z的当前值用于评估表达式(即z ++评估为z),并且z仅在完成所有其他操作之后才递增(http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm)
答案 1 :(得分:0)
更改
while(*s++)
到
while(*s && *(++s));
所以s的第一个递增,然后被检查,以便使指针指向最后一个地址。