C中的字符串连接函数没有做任何事情,那么正确的方法是什么?

时间:2012-02-09 17:28:29

标签: c string concatenation

我正在学习C语言......

我想编写一个连接两个字符串的函数。 我写了一个函数,但它不起作用; 它在编译时没有任何错误, 但是在运行它时什么都不做。

这是我的代码:

char* str_sum(char* s1, char* s2){
    int j = strlen(s1);
    int i=0;
    while(s2[i]){
            s1[j]=s2[i];
            j++;
            i++;
    }
    return s1;
}
int main(){
    char* s1, s2;
    s1 = "Joe";
    s2 = "Black";
    printf("%s\n",sum_str(s1,s2));
    return 0;
}

8 个答案:

答案 0 :(得分:2)

您的功能可能如下所示:

char* sum_str(char* s1, char* s2)
{
    int lenS1 = strlen(s1);
    int lenS2 = strlen(s2);
    char* newString = malloc((lenS1 + lenS2 + 1) * sizeof(char));
    int i = 0;
    while(i < lenS1)
    {
        newString[i] = s1[i];
        i++;
    }
    while(i < lenS2 + lenS1)
    {
        newString[i] = s2[i - lenS1];
        i++;
    }
    newString[i] = '\0';
    return newString;
}

请注意,此函数会分配新字符串,这意味着当您使用此字符串时,您应该free此数据。另请注意,终止字符('\0')存储在此char数组的末尾,以便printf可以正确“打印”它。

主要是:

int main()
{
  char *s1, *s2, *s3;
  s1 = "Joe";
  s2 = " Black";
  s3 = sum_str(s1,s2);
  printf("%s\n", s3);
  free(s3);
  return 0;
}

输出:Joe Black

请注意,我已声明变量s1s2s3,如下所示:char *s1, *s2, *s3;。如果我这样写:char *s1, s2, s3;那么变量s2s3不再是字符数组而只是字符。

另请注意此程序:

  char *s1 = "Joe";
  s1[0] = 'X';
  printf("%s\n", s1);

会崩溃,因为它会尝试更改常量字符串文字"Joe"。在这种情况下,s1是指向此文字的第一个字符的指针。

但是这个程序运行正常,输出结果为Xoe

  char s1[] = "Joe";
  s1[0] = 'X';
  printf("%s\n", s1);

s1是使用字符串"Joe"初始化的数组,因此可以更改它。

答案 1 :(得分:1)

这样的事情:

char* str_sum(char* s1, char* s2){
   int len = strlen(s1) + strlen(s2);
   char* buff = malloc(len * sizeof(char) + 1);

   strcpy(buff, s1); //we don't need the zero termination char here.
   strcpy(buff + strlen(s1), s2);
   buff[len] = '\0';
   return buff;
}

答案 2 :(得分:0)

代码有两个主要问题:

  1. string s1可能指向只读内存但不能 改性。在我的机器上运行示例会导致分段错误。
  2. 字符串s1不足以容纳额外的字符串 s2的内容。它应该声明为: char s1 [30] =“乔”;

答案 3 :(得分:0)

您的函数不会分配内存来编写新字符串。也许你可以使用strcat或者像这样重写它:

char* str_sum(char* s1, char* s2) {
  int l1 = strlen(s1), l2 = strlen(s2), i;
  char sum = (char *)malloc(l1+l2+1);

  for(i=0; i<l1; i++) sum[i] = s1[i];
  for(i=0; i<l2; i++) sum[i+l1] = s2[i];

  sum[l1+l2] = '\0'; // NULL terminated    
  return sum;
}

答案 4 :(得分:0)

您的str_sum函数需要创建一个足以容纳连接字符串内容的数组。

char *str_sum( const char *s1, const char *s2 )
{
  char *ret = malloc( strlen(s1) + strlen(s2) + 1 ); // 1 for terminating NULL char

  if( ret == NULL ) {
    return NULL;
  }
  strcpy( ret, s1 );
  strcpy( &ret[strlen(s1)], s2 );
  return ret;
}

此外,调用者需要free()返回的指针(如果它不是NULL)。

答案 5 :(得分:0)

你可以用strcat()做到这一点 或者没有(这是毫无意义的,但为了完整起见,我将其包括在内。请参阅下面的例子。

char* str_sum_wstrcat(char* s1, char* s2)
{
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    int i=0;
    char* sum = malloc(len1+len2+1);
    strcpy(sum,s1);
    strcat(sum,s2);


    return sum;
}

char* str_sum(char* s1, char* s2)
{
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    int i=0;
    char* sum = malloc(len1+len2+1);
    strcpy(sum,s1);
    while(i<len2)
    {
        sum[len1+i] = s2[i];
        i++;
    }
    sum[len1+i]='\0';


    return sum;
}

int main()
{
  char* s1 = malloc(100);
  char* s2 = malloc(100);
  s1 = "Joe";
  s2 = "Black";
  printf("%s\n",str_sum(s1,s2));
  //or
  printf("%s\n",str_sum_wstrcat(s1,s2)); 
  return 0;
}

答案 6 :(得分:0)

您正在做的事情会导致细分错误。字符串文字可能位于内存的只读部分。如果您尝试写入这样的位置,则会出现运行时错误。正如其他答案所说,请使用malloc。包括我在内的许多初学者都犯了一个错误。

答案 7 :(得分:0)

这是一种没有任何预定义功能的方法。连接的结果放在函数的第三个参数中,即结果字符串:

  void str_cat_101(char const input1[], char const input2[], char result[])
  {
     int i, z;
     for(i = 0; input1[i] != 0; i++)
     {
        result[i] = input1[i];
     }
     for(z=0; input2[z] != 0; z++)
     {
        result[i+z] = input2[z];
     }
     result[i+z] = 0;
  }