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

carvr3hs  于 2023-04-19  发布在  其他
关注(0)|答案(5)|浏览(117)

鉴于此作业:写一个有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;
}
ovfsdjhp

ovfsdjhp1#

这很好。请进行以下更改:

#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--; //No need to decrement

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

    if (h2>0){
       // i--; //No need to decrement

        while (h2>0)
        {
            c[i]=b[l]; //here it should be 'b' not 'a'
            l++;
            i++;
            h2--;
        }
    }

    for (j=0; j<=strlen(a)+strlen(b); j++) //use '<=' not '<'
        printf("%c",c[j]);
    printf("\n");
}

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

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

    return 0;
}
gcxthw6b

gcxthw6b2#

您的代码中存在一些问题。
次要问题:
1.您将homework函数定义为int homework(char a[], char b[])-但该函数中没有return语句。
1.在函数homework中变量db的用法是什么?我不认为我理解了它的用法-声明(或使用)该变量真的有必要吗?
现在的主要问题:
这一次,我首先关注的是这个循环-

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,你将从ab中取出一个额外的char作为输出数组-在那一刻分别是'\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的数量,从b复制到c。但是在这个循环中,您试图从a复制char
所以,根据我的理解,(!)线应该是-

c[i]=b[l];
webghufk

webghufk3#

我试着做了这样的事情:

#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);
}
isr3a4wc

isr3a4wc4#

你可以试试这个:”

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函数的时候不要忘记返回一些东西;)

jljoyd4f

jljoyd4f5#

/* combine.c

*/

#include <stdio.h>

void combine(const char str1[], const char str2[], char str3[])
{
    int i = 0;
    int index = 0;
    // combine alternating characters of str1 and str2 up to
    // the end of one of the strings 
    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];

    combine(s1, s2, s3);
    printf("\n"
          "%s combined with %s = %s\n", s1, s2, s3);

    return 0;
}

相关问题