簡體   English   中英

如何在C中將兩個字符串的字符組合在一起?

[英]How to combine together the characters of two strings in C?

完成此作業:編寫一個具有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;
}

我嘗試做類似的事情:

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

這很好。 進行以下更改:

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

您的代碼中存在一些問題。

小問題:

  1. 您將homework功能定義為int homework(char a[], char b[]) -但該功能中沒有return語句。

  2. 函數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代表剩余要從b復制到cchar數。 但是,在這個循環中,你試圖復制chara

因此,根據我的理解, (!)行應為-

c[i]=b[l];
/* 

*/

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

您可以嘗試以下方法:

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函數時,請不要忘記返回某些內容;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM