在C中链接2个字符串

时间:2018-04-30 16:50:58

标签: c string segmentation-fault

我想在C中链接2个字符串。我使用的函数叫concat() 首先,我定义了类似的东西并且它起作用了

char* concat(const char *s1, const char *s2)
{
    char* result = malloc (15);  
    int lengh1 =  simple_strlen (s1);
    int lengh2 =  simple_strlen (s2);
    int i=0,j;
    for ( i = 0 ;i < lengh1;i++){
        if (i!=lengh1-1)
            result[i]=s1[i];
        else{
            result[i]=s1[i];
            for ( j=i+1 ; j< lengh1+lengh2;j++){
                    result[j] = s2[j-i-1];
            }
        }
    }

return result;
} 

但后来我被要求在没有malloc()的情况下这样做,所以我定义了这样的东西:

char* concat( char *result, const char *s2)
{  
    int lengh1 =  simple_strlen (result);
    int lengh2 =  simple_strlen (s2);
    int i=0;
    for ( i = 0 ;i < lengh2;i++){   
            result[i+lengh1]=s2[i];
    } 
    return result;
}

但它有分段错误

example:



   int main(int argc , char* argv[], char* envp[])
   {
          printf(concat( "hello", "world"));/*output expected "helloworld"*/

        return 0;

   }   

2 个答案:

答案 0 :(得分:1)

您的代码中存在多个问题:

  • malloc版本中,为目标字符串分配的空间在15进行硬编码,而不是将其计算为lengh1 + lengh2 + 1,为两个字符串和尾随空字节留出足够的空间。
  • 在两个版本中,都没有在目标字符串的末尾设置空终止符。
  • 在没有malloc的版本中,您必须提供足够大的数组作为concat()的目标。不能修改字符串常量。一个简单的解决方案是将目标缓冲区和源字符串作为单独的参数传递。

以下是修改后的版本:

char *concat(const char *s1, const char *s2) {
    int length1 = simple_strlen(s1);
    int length2 = simple_strlen(s2);
    char *result = malloc(length1 + length2 + 1);
    int i, j;
    for (i = 0; i < length1; i++) {
        result[i] = s1[i];
    }
    for (i = 0; i < length2; i++) {
        result[length1 + i] = s2[1];
    }
    result[length1 + length2] = '\0';
    return result;
}

没有malloc()

#include <string.h>

char *concat(char *dest, const char *s1, const char *s2) {
    char *p = dest;
    while (*s1)
        *p++ = *s1++;
    while (*s2)
        *p++ = *s2++;
    *p = '\0';
    return dest;
}

int main() {
    char buf[100];
    /* output expected "helloworld" */
    printf("%s\n", concat(buf, "hello", "world"));
    return 0;
}

答案 1 :(得分:0)

如前面的评论者所述,您需要在某处分配内存来存储连接的字符串。如果不允许通过malloc在堆上进行分配,那么您可以执行以下操作:

#include "stdafx.h"
# include <string.h>
char* concat( char * result , const char *s1, const char *s2)
{
    int lengh1 = strlen(s1);
    int lengh2 = strlen(s2);
    int i = 0;
    for (i = 0; i < lengh1; i++) {
        result[i] = s1[i];
    }
    for (i = 0; i < lengh2; i++) {
        result[i+ lengh1] = s2[i];
    }
    return result;
}

int main()
{

    char mybuffer[100];
    memset(mybuffer, 0, sizeof(mybuffer));
    printf(concat( mybuffer,"hello", "world"));/*output expected "helloworld"*/
    return 0;
}