此字符串串联函数有什么问题

时间:2018-07-02 08:22:01

标签: c

为什么此代码无法正常工作? 这是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++);
}

2 个答案:

答案 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的第一个递增,然后被检查,以便使指针指向最后一个地址。