私はコードにこの部分を持っています:
char* data="My name is: ";
argv[1]
これに、名前を表す引数を追加したいと思います。これをCコードで行う方法は?私は試しましたがstrcpy
、strcat
Ipcpがこれを行うとセグメンテーション違反が発生します:
strcpy(data,argv[1]);
誰か助けてもらえますか?
また、なぜこれが:data=data+argv[1]
機能していないのですか?
私はコードにこの部分を持っています:
char* data="My name is: ";
argv[1]
これに、名前を表す引数を追加したいと思います。これをCコードで行う方法は?私は試しましたがstrcpy
、strcat
Ipcpがこれを行うとセグメンテーション違反が発生します:
strcpy(data,argv[1]);
誰か助けてもらえますか?
また、なぜこれが:data=data+argv[1]
機能していないのですか?
連結の結果を格納できるメモリを用意する必要があります。例えば:
char buffer[1024];
strcpy(buffer, "My name is: ");
strcat(buffer, argv[1]);
ただし、これはエラーが発生しやすいことに注意してください。argv[1]
プレフィックス文字列と組み合わせたの値が1024文字より長い場合、バッファオーバーフローが発生します。だから、多分このようなもの:
char* prefix = "My name is: ";
int length = strlen(prefix) + strlen(argv[1]) + 1;
char* buffer = malloc(length);
if (!buffer) abort();
else
{
strcpy(buffer, prefix);
strcat(buffer, argv[1]);
/* Do something with buffer here. And don't
* forget to free it, once you no longer need
* it. This is C -- no garbage collection. */
free(buffer);
}
のメモリdata
は読み取り専用セクションに割り当てられます。したがって、変更すると問題が発生します。
メモリ内のどこに文字列リテラルがありますか?スタック/ヒープ?
+
演算子はあなたが思ったように連結を行いません。
strcat()
関数はで実装されstring.h
ます。
また、なぜこれが:data = data + argv [1]が機能していないのですか?
これについて-Cでは、dataとargvは、文字列を含むメモリ内のアドレスへのポインタにすぎません。この方法でstrings(char *)を連結することはできません。文字列ライブラリを見てみることをお勧めします。おそらく、C全体でもう少し見てみましょう。
スペースがないため、データポインターに追加できません
char result_data [1024];
char* data="My name is: ";
strcat(result_data, data);
strcat(result_data, argv[1]);