[英]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;
}
您的代碼中存在一些問題。
小問題:
您將homework
功能定義為int homework(char a[], char b[])
-但該功能中沒有return
語句。
函數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=0
和h2>0
,您將從a
和b
獲取一個額外的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
復制到c
的char
數。 但是,在這個循環中,你試圖復制char
從a
。
因此,根據我的理解, (!)
行應為-
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.