如何将C中两个字符串的字符组合在一起?

时间:2017-04-21 18:18:38

标签: c string

鉴于此作业:编写一个具有3个参数的函数:前两个将在第3个中合并。示例:s1 =“abcde”,s2 =“1234567”,结果:s3 =“a1b2c3d4e567”。

提前感谢您的回答。 :)

到目前为止,我的代码看起来像这样(问题是它只在两个字符串的长度相等时才有效:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int homework(char a[], char b[])
{
    char c[210]={'0'};
    int h1=strlen(a);
    int h2=strlen(b);
    int i=0;
    int j;
    int db=0;
    int l=0;
    while ( h1>=0 && h2>=0 )
    {
        db++;
        c[i]=a[l];
        c[i+1]=b[l];

        h2--;
        h1--;
        i+=2;
        l++;
    }
    h1++;
    h2++;

    printf("%d %d",h1,h2);

    if (h1>0){
        i--;
        while (h1>0)
        {
            c[i]=a[l];
            l++;
            i++;
            h1--;
        }
    }

    if (h2>0){
        i--;
        while (h2>0)
        {
            c[i]=a[l];
            l++;
            i++;
            h2--;
        }
    }

    for (j=0; j<strlen(a)+strlen(b); j++)
        printf("%c",c[j]);
}


int main()
{
    char a[100],b[100];

    gets(a);
    gets(b);
    homework(a,b);

    return 0;
}

5 个答案:

答案 0 :(得分:0)

我尝试过这样的事情:

#include <stdio.h>
#include <string.h>

void combinestrings(char* str1,char* str2,char* outputstr)
{
    int slen1 = (int)strlen(str1);
    int slen2 = (int)strlen(str2);
    int slength;
    if (slen1 < slen2)
        slength = (int)strlen(str2);
    else
        slength = (int)strlen(str1);

    int charptr = 0;
    for (int n=0;n < slength;n++)
    {
        if (*(str1+n) && slen1)
        {
            *(outputstr+charptr) = *(str1+n);
            ++charptr;
            --slen1;
        }
        if (*(str2+n) && slen2)
        {
            *(outputstr+charptr) = *(str2+n);
            ++charptr;
            --slen2;
        }
    }
}

void main()
{
    char* str1 = "abcde";
    char* str2 = "123456789";
    char out[256];

    combinestrings(str1, str2, &out[0]);

    printf("%s\n",out);
}

似乎可以在Linux gcc下编译好。

或者(正如Roi所指出的)如果你不介意输出字符串的内存分配。类似的东西:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void combinestrings(char* str1,char* str2,char* outputstr)
{
    int slen1 = (int)strlen(str1);
    int slen2 = (int)strlen(str2);
    int slength;
    if (slen1 < slen2)
        slength = (int)strlen(str2);
    else
        slength = (int)strlen(str1);

    int charptr = 0;
    for (int n=0;n < slength;n++)
    {
        if (*(str1+n) && slen1)
        {
            *(outputstr+charptr) = *(str1+n);
            ++charptr;
            --slen1;
        }
        if (*(str2+n) && slen2)
        {
            *(outputstr+charptr) = *(str2+n);
            ++charptr;
            --slen2;
        }
    }
}

void main()
{
    char* str1 = "abcde";
    char* str2 = "123456789";
    char* outstr;

    //Preallocate our output string and set memory to zero
    int slen1 = (int)strlen(str1);
    int slen2 = (int)strlen(str2);
    outstr = (char*)calloc((slen1+slen2)+1,sizeof(char));
    if (!outstr)
    {
        printf("Could not allocate output string\n");
        return;
    }

    //Call our strings 'riffle' function
    combinestrings(str1, str2, &outstr[0]);

    //Output string
    printf("%s\n",outstr);

    //Deallocate our memory
    free(outstr);
}

答案 1 :(得分:0)

这项工作没问题。进行以下更改:

    decimal[] values = {-1.7m , 3.0m , 0.0m , 1.5m , 0.0m , -1.7m , 2.3m , -1,7m};

    var result = values
        .GroupBy(v => v)
        .ToDictionary(g => g.Key, g => g.Count());

    foreach(var kvp in result)
    {
        Console.WriteLine("{0} appears {1} time(s)", kvp.Key, kvp.Value);
    }

答案 2 :(得分:0)

您的代码中存在一些问题。

小问题:

  1. 您已将homework函数定义为int homework(char a[], char b[]) - 但该函数中没有return语句。

  2. 函数db中变量homework的用法是什么?我不认为我理解它的用法 - 声明(或使用)该变量真的有必要吗?

  3. 现在主要问题:

    这一次,我首先关注这个循环 -

    while( h1>=0 && h2>=0 )
    {
        // your code
    }
    

    为了表明你做了什么错误 - 让我们假设两个字符串a="abc"strlen(a)=3)和b="12345"strlen(b)=5)。

    您的循环将正常运行,直至l=2 - 此时(l=2),输出char数组c={'a','1','b','2','c','3'}

    但之后,因为h1=0h2>0,您将从chara获取另外一个b作为输出数组 - 这些是在那一刻'\0''4'分别。在此迭代之后,输出数组变为{'a','1','b','2','c','3','\0','4'}。你不应该做这个循环的迭代。

    考虑到这个问题,你的循环应该是这样的:

    while( h1>0 && h2>0 )
    {
        // your code
    }
    

    或者,也许是这样:

    while( a[l]!='\0' && b[l]!='\0' )
    {
        // your code
    }
    

    在这个循环之后,我看到另一个这样的循环:

    while (h2>0)
    {
        c[i]=a[l]; // ------ (!)
        l++;
        i++;
        h2--;
    }
    

    由于最初为h2=strlen(b);,因此h2表示要从char复制到c的剩余b的数量。但是在此循环中,您尝试从char复制a

    所以,根据我的理解,(!)行应该是 -

    c[i]=b[l];
    

答案 3 :(得分:0)

/* 

*/

#include <stdio.h>

void mixer (const char str1[], const char str2[], char str3[])
{
    int i = 0, index = 0;

    while ( (str1[i] != '\0') && (str2[i] != '\0') ) {
        str3[index++] = str1[i];
        str3[index++] = str2[i];
        ++i;
    }

    if ( str1[i] != '\0' ) {
        // str1 has additional characters
        while ( str1[i] != '\0' )
            str3[index++] = str1[i++];
    }
    else {
        // str2 may have additional characters
        while ( str2[i] != '\0' )
            str3[index++] = str2[i++];
    }

    // terminate the string with a null character
    str3[index] = '\0';    
}

int main (void)
{
    const char s1[] = { "abcde" };
    const char s2[] = { "1234567" };
    char s3[128];

    mixer (s1, s2, s3);

    printf ("s3 = %s", s3);

    return 0;
}

答案 4 :(得分:0)

你可以试试这个: “

void    Homework(char *str1, char *str2)
{
  int   i;
  int   j;
  int   k;
  char *str3;

  i = 0;
  j = 0;
  k = 0;
  str3 = malloc(sizeof(char) * (strlen(str1) + strlen(str2)) + 1);
  while (strlen(str3) != strlen(str1) + strlen(str2))
    {
      if (k % 2 == 0 && str1[i] != 0)
        {
          str3[k] = str1[i];
          i++;
        }
      else if (k % 2 == 1 && str2[j] != 0)
        {
          str3[k] = str2[j];
          j++;
        }
      else if ((i + 1) > strlen(str1))
        {
          str3[k] = str2[j];
          j++;
        }
      else if ((j + 1) > strlen(str2))
        {
          str3[k] = str1[i];
          i++;
        }
      k++;
    }
  printf("Your combine string is: %s. \n", str3);
}'

PS:创建int函数时不要忘记返回一些内容;)