char *strcat(char*dest, char*src) {
while (dest != '\0') {
*dest++;
}
while (src != '\0') {
*dest++ = *src++;
}
return dest;
}
我一直在*dest++ = *src++
行上遇到分段错误。关于如何解决问题的任何想法?
答案 0 :(得分:2)
您的代码有4个问题:
src
指针应声明为const char *
,以符合此函数的标准声明,并允许将指针传递给常量字符串作为源。以下是更正后的版本:
char *strcat(char *dest, const char *src) {
char *saved = dest;
while (*dest != '\0') {
dest++;
}
while ((*dest++ = *src++) != '\0') {
continue;
}
return saved;
}
答案 1 :(得分:1)
dest
和source
永远不会成为'\0'
,如果它们一开始就不为空(或者可能在很长一段时间后才是正确的,但你可能会用尽记忆早在那之前)。
您应该使用:
while(*dest != '\0'){
dest++;
}
while(*src != '\0'){
*dest++ = *src++;
}
检查指针下面的值。
还有一些其他问题:
结果字符串不以空值终止。
返回指向字符串结尾的指针。
正如其他人所说:src
也应该是const pointer
。
这应该这样做:
char *strcat(char *dest, const char *src)
{
char *start_pos = dest;
while(*dest != '\0')
dest++;
while(*src != '\0')
*dest++ = *src++;
*dest = '\0';
return start_pos;
}
次要细节:除了使用的标准strcat()
之外,我会给这个功能一些其他名称。
答案 2 :(得分:1)
好的:Kernighan方式:
char *strcat(char *dest, char *src)
{
char *org = dest;
while(*dest++){;}
// at this moment, *dest MUST be pointing to '\0'
while(*dest++ = *src++){;}
// at this moment, *dest MUST be pointing to '\0' agian
return org;
}
更新(有礼貌地@chqrlie):
char *strcat(char *dest, char *src)
{
char *org = dest;
for(; *dest; dest++) {;}
// at this moment, dest MUST be pointing to '\0'
while(*dest++ = *src++) {;}
// at this moment, dest points past the '\0', but who cares?
return org;
}