2

を使用せずに2つの文字列を連結しようとしましたstrcatが、ランタイムエラーが発生します。誰かがここで私を助けてください...

また、このステートメントはq=q+len;正しいですか?変数をポインターに追加できますか?

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

void xstrcat(char*,char*);
int main()
{
    char source[]="folks";
    char target[30]="hello";
    xstrcat(target,source);
    printf("%s",source);
    printf("%s",target);
    return 0;
}

void xstrcat(char*p,char*q)
{
    int len=0;
    len=strlen(q);
    q=q+len;
    while(*p!='\0')
    {
        *q=*p;
        q++;
        p++;
    }
    *q='\0';
}
4

5 に答える 5

3

実装におけるいくつかの間違い:

1-ランダ​​ムメモリにアクセスしています。/0文字列にが含まれていない場合。

while(*p!='/0')

でなければなりません:

while(*p!='\0')

スラッシュ\に注意してください。

2-に追加しようとすると、ランダムメモリが上書き*pされ*qます。それらを格納するのに十分なスペースを持つ新しい変数を作成する必要があります。

また、このステートメントはq = q+lenです。正しい?変数をポインターに追加できますか?

はい。ポインタ演算式です。

于 2012-07-09T06:00:06.940 に答える
1

関数呼び出しの最初のパラメーターとしてターゲットを渡していますが、関数は2番目のパラメーターをターゲットとして使用しようとしているようです。したがって、関数呼び出しでパラメータの場所を切り替える必要があるかもしれません。

もう1つのことは、ヌル文字をエスケープするときにバックスラッシュの代わりにスラッシュを使用していることです。したがって、「/0」を「\0」に変更します。

ポインタへのintの追加について:あなたの場合、関数のポインタ演算のタイプは完全に合法です。

于 2012-07-09T06:03:35.633 に答える
1

いくつかのことがあります。まず、チェックする必要があります\0/0

while(*p!='\0')

ただし、文字列リテラルに文字列を追加しようとすると、未定義の動作が発生します。スイッチ

xstrcat(target,source); 

xstrcat(source, target); 

最後に、の最後の行を次のxstrcatように変更する必要があります

*q='\0';
于 2012-07-09T06:05:16.690 に答える
0

問題は、次の行のコードにあります。

xstrcat(target,source);

そのはず

xstrcat(source,target);

または、xstrcat関数で、最初のパラメーターをターゲット、2番目のパラメーターをソースと見なしてみてください。

于 2012-07-09T06:13:19.047 に答える
0

あなたはメモリを上書きしています。

source連結された文字を保持するのに十分なメモリがない連結を行っています。

sourceとの定義を逆にすることをお勧めしますtarget。すなわち

char source[30] = "folks";
char *target = "hello";

または

xstrcatとして呼び出すxstrcat(source, target);

于 2012-07-09T06:02:34.373 に答える