-3
int main(int argc, char * argv[]){

   char file_extension[10];

   strncat(file_extension, argv[2][5], 6);

これを行うと、「警告:「strncat」の引数2を渡すと、キャストなしで整数からポインタが作成されます」というメッセージが表示されます。これを修正する方法を知っている人はいますか?

4

4 に答える 4

3

argv[2]であるchar *ためargv[2][5]char

strncatchar *パラメータのみを受け入れます!

于 2013-02-08T19:08:17.967 に答える
2

argv[2][5]文字のみです。

だけで試してくださいargv[2]

于 2013-02-08T19:08:55.540 に答える
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;
于 2013-02-08T19:13:45.163 に答える
1

あなたにはいくつかの問題があります:

  • argv[2][5]は単一文字です:3番目の入力引数の6番目の文字ですが、の2番目の引数は、単一の文字ではなく、文字(つまり、C文字列)へのポインターをstrncat取ります。
  • file_extensionstrncatそもそもnullで終了していない(初期化されていない)ので、それを呼び出すのは未定義の動作です
  • の最後の引数strncatは、連結するソース文字列の最大文字数であり、出力バッファのサイズではありません。バッファオーバーフローから保護することはできません。
  • strncpyの代わりに実際に書き込むつもりだった場合は、必ずしも出力をnullで終了するわけstrncatではないことにも注意する必要があります。strncpy

これらの問題には簡単な修正がありますが、最善の修正は、実行する内容によって異なります。ファイル拡張子は読み取り専用ですか。新しいファイル名を作成していますか?それで何が起こるのでしょうか?

特にコードが正しく記述されていない場合にバッファオーバーフローやメモリ破損のリスクが高い場合は、文字列コードの動作をしっかりと理解せずに文字列コードを盲目的に記述しようとするのではなく、C文字列とCプログラミングに関する優れた本を入手することを強くお勧めします。 。

于 2013-02-08T19:10:15.307 に答える