int main(int argc, char * argv[]){
char file_extension[10];
strncat(file_extension, argv[2][5], 6);
これを行うと、「警告:「strncat」の引数2を渡すと、キャストなしで整数からポインタが作成されます」というメッセージが表示されます。これを修正する方法を知っている人はいますか?
argv[2]
であるchar *
ためargv[2][5]
、char
strncat
char *
パラメータのみを受け入れます!
argv[2][5]
文字のみです。
だけで試してくださいargv[2]
。
したがって、私が最終的にすべてのあいまいなコメントを正しく理解できた場合、文字列の一部をコピーしたいようです。
const char foo[] = "abcdefghijklm";
const size_t start = 3;
const size_t len = 5;
char the_copy[len + 1];
memcpy(the_copy, foo + start, len);
the_copy[len] = 0;
あなたにはいくつかの問題があります:
argv[2][5]
は単一文字です:3番目の入力引数の6番目の文字ですが、の2番目の引数は、単一の文字ではなく、文字(つまり、C文字列)へのポインターをstrncat
取ります。file_extension
strncat
そもそもnullで終了していない(初期化されていない)ので、それを呼び出すのは未定義の動作ですstrncat
は、連結するソース文字列の最大文字数であり、出力バッファのサイズではありません。バッファオーバーフローから保護することはできません。strncpy
の代わりに実際に書き込むつもりだった場合は、必ずしも出力をnullで終了するわけstrncat
ではないことにも注意する必要があります。strncpy
これらの問題には簡単な修正がありますが、最善の修正は、実行する内容によって異なります。ファイル拡張子は読み取り専用ですか。新しいファイル名を作成していますか?それで何が起こるのでしょうか?
特にコードが正しく記述されていない場合にバッファオーバーフローやメモリ破損のリスクが高い場合は、文字列コードの動作をしっかりと理解せずに文字列コードを盲目的に記述しようとするのではなく、C文字列とCプログラミングに関する優れた本を入手することを強くお勧めします。 。