0

コードは、ライブラリ関数を使用して文字列をコピーして連結することでした.私が使用したコード:

#include<stdio.h>
#include<conio.h>
#include<string.h>
#define MAX 100
char* newStrCpy(char string1[],char string2[])
{
        int i=0;
        while(string1[i]!='\0')
        {
            string2[i]=string1[i];
            i++;
        }
return (string2);
}
char* newStrCat(char destination[],char arr[])
{
int a=0;
int destlen=0;
while(destination[destlen]!='\0')
{
    destlen ++;
}
while(a<(MAX-destlen))
{
    destination[(destlen+a)]=arr[a];
    a++;
}
return destination;
}
void main()
 {
char string1[MAX],string2[MAX];
int i=0,j=0;
char bak[5]="\n is";
char som[50]=" the concatenated array.";
fflush(stdin);

printf("Enter a string:\n");
scanf("%[^\n]s",&string1);
newStrCpy(string1,string2);
printf("The copied string is:\n");
while(string2[i]!='\0')
{
    printf("%c",string2[i]);
    i++;
}
newStrCat(string2,bak);
newStrCat(string2,som);
printf("\nThe conctenated string is:\n");
while(string2[j]!='\0')
{
    printf("%c",string2[j]);
    j++;
}
fflush(stdout);
getch();
}

そして私が得た出力:

Enter a string:
Welcome!!

コピーされた文字列は次のとおりです。

Welcome!!
he concatenated string is:
Welcome!!
is the concatenated string
4

2 に答える 2

0

に null ターミネータ (文字列の最後の文字) を必ずコピーしてくださいnewStrCpy/Cat

于 2012-05-25T05:51:59.833 に答える
0

string2配列を初期化する必要があります。

char string2[MAX] ={'\0'};

これにより、すべてのメンバーが\0[Ref #1]\0に設定され、コピー後に文字列配列に手動で追加する必要がなくなります。
現在、string2配列が null で終了することはないため、whileループは a に遭遇するまで続き\0、文字列の一部ではないガベージを出力します。

また、余談ですが、

fflush(stdin);

プログラムにUndefined Behaviorという野獣を持たせます。使用しないでください。
fflush()出力ストリームで動作することが保証されていますstdout


[参照 #1]
C99 標準 6.7.8.21

集合体の要素またはメンバーよりもブレースで囲まれたリスト内の初期化子が少ない場合、または配列内の要素よりも既知のサイズの配列を初期化するために使用される文字列リテラル内の文字が少ない場合、集合体の残りの部分は静的ストレージ期間を持つオブジェクトと同じように暗黙的に初期化されます。

于 2012-05-25T05:52:18.990 に答える