私はJavaプログラマで、Cを拾うのに苦労しています。特に、strcat()を理解するのに苦労しています。私が電話した場合:strcatはソース文字列を上書きしますか?
strcat(dst, src);
私はstrcat()が自分のdst文字列を変更することになります。 src文字列だけを残してはいけませんか? GCCでコンパイル、
私のLinuxボックスに、この出力を生成#include<stdio.h>
#include<string.h>
void printStuff(char* a, char* b){
printf("----------------------------------------------\n");
printf("src: (%d chars)\t\"%s\"\n",strlen(a),a);
printf("dst: (%d chars)\t\"%s\"\n",strlen(b),b);
printf("----------------------------------------------\n");
}
int main()
{
char src[25], dst[25];
strcpy(src, "This is source123");
strcpy(dst, "This is destination");
printStuff(src, dst);
strcat(dst, src);
printStuff(src, dst);
return 0;
}
:以下のコードを考えてみましょう
----------------------------------------------
src: (17 chars) "This is source123"
dst: (19 chars) "This is destination"
----------------------------------------------
----------------------------------------------
src: (4 chars) "e123"
dst: (36 chars) "This is destinationThis is source123"
----------------------------------------------
私は完全な「これはsource123される」文字列がメモリに残っていると仮定していますstrcat()は、char * srcポインタを13文字分進めました。しかし、なぜ?なぜ13文字ですか?私はdst文字列の長さで遊んだし、strcat()が完了した後は必ずsrcポインタに影響を与えます。しかし、私は理由を理解していません...
また... GDBでこれをデバッグする方法は?私はstrcat()関数にステップするために "ステップ"を試みましたが、その関数はデバッガによって解析されなかったと思います。 "ステップ"は何もしなかった。
ありがとうございます! -ROA
PS - このサイトの同様のstrcat()記事を読みましたが、私の質問に直接当てはまるようなものは見当たりませんでした。私がポストを見逃した場合は謝罪しました。
"これは完全なものです"これはsource123 "文字列がまだメモリに残っている" - >多分です。コードがサンドボックスの外部で実行されると(配列の境界外に書き込む)、未定義の動作(UB)が発生する可能性があります。期待しないでください。 "しかし、src文字列だけを残してはいけませんか?"今日の結果と説明は意味をなさないかもしれませんが、明日の結果は異なるかもしれません。 – chux
あなたは 'dst'に対して' char [25] 'しか割り当てませんでした。あなたはそこに37文字を入れる(後のヌルを含む)とどのように期待しますか? – user2357112
'src' +' dst'に 'dst [25]'で割り当てられた24 + 1ターミネーター文字よりも多くの文字列があります –