Char * strcat实现导致分段错误

时间:2016-01-18 00:10:05

标签: c strcat

char *strcat(char*dest, char*src) {
    while (dest != '\0') {
        *dest++;
    }
    while (src != '\0') {
        *dest++ = *src++;
    }
    return dest;
}

我一直在*dest++ = *src++行上遇到分段错误。关于如何解决问题的任何想法?

3 个答案:

答案 0 :(得分:2)

您的代码有4个问题:

  • 您正在将指针与空字符进行比较,而不是比较它们指向的字符。因为在它变为0之前需要将指针递增很多次,如果有的话,你正在读取和/或写入超出缓冲区的末尾,在此之前从/到无效的内存,因此崩溃。
  • 您不会终止目标字符串。
  • 将指针返回到目标字符串的末尾而不是原始目标字符串。这可能是一个有用的API,但您应该使用不同的名称。
  • 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)

destsource永远不会成为'\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;
}