16

オーバーフローが原因で問題が発生する可能性があることは誰もが知っています。これがstrn*が存在する理由です。ほとんどの場合、それらは理にかなっています。ただし、次のようにstrncmpを使用してコマンドラインパラメーターを比較するコードを見てきました。

if(... strncmp(argv[i], "--help", 6) == 0

さて、これは不要で、おそらく危険でさえあると思いました(パラメータが長いと、リテラル内の文字を誤算しやすくなります)。

strncmpはnullで停止し、コードはすでにargv[i]がnullで終了していると想定しています。文字列リテラルはnullで終了することが保証されているので、strcmpを使用してみませんか?

何かが足りないのかもしれませんが、これを何度か見たことがあり、今回は質問するほど興味をそそられました。

4

9 に答える 9

19

はい、それは完全に安全であり、標準的な慣行と見なされています。文字列リテラルは、適切にnullで終了することが保証されています。

于 2009-01-15T21:43:01.093 に答える
12

コードが に一致することを意図していないことは確か "--helpmedosoemthingwithareallylongoptionname"ですか?

于 2009-01-15T21:48:20.707 に答える
4

あなたが正しい。

さらに、提供した例は「--help」だけでなく、「-help」で始まるすべてのもの(「--help-me」など)にも一致します。

熱心すぎる==間違っているまれなケース。

于 2009-01-15T21:47:19.180 に答える
1

私の知る限り、あなたは絶対に正しいです-strcmpの代わりにstrncmpを使用する理由はありません。おそらく人々はただ慎重になっているだけです(必ずしも悪いことではありません)。

于 2009-01-15T21:44:13.010 に答える
1

他の人が言っstrcmp()たように、リテラルで使用しても完全に安全です。を使用したい場合はstrncmp()、これを試してください:

strncmp(argv[i], "--help", sizeof("--help"))

コンパイラにカウントを任せましょう!

これは、正確な文字列「--help」にのみ一致します。"--help"(コードのように)で始まるすべての文字列に一致させたい場合sizeof() - 1は、最後の'\0'.

于 2009-01-15T21:49:33.123 に答える
0

はい、リテラルの存在により、比較されるデータのサイズがリテラルのサイズに制限されます。stncmpはここでは冗長です。

strncmpは入るのに良い習慣だと言う人もいるかもしれませんが、これは文字数を数える手間が重くなります。

于 2009-01-15T21:44:17.487 に答える
0

私はおそらくCでこのようなものを書くでしょう(私がstrncmpを頻繁に使用していて、文字数を数えたくない場合):

if(... strncmp(argv[i], "--help", sizeof("--help") - 1) == 0 
于 2009-01-15T21:45:26.940 に答える
0

安全のために行われていない可能性があります。コマンドラインパラメータの開始のみをチェックするために行うことができたはずです。多くのプログラムは、コマンドラインスイッチの先頭をチェックし、残りを無視します。

于 2009-01-15T21:46:50.993 に答える
0

ええと... 技術的には、このようなことは起こりませんでしたか?

char *cp1 = "help";
cp1[4] = '!'; // BAD PRACTICE! don't try to mutate a string constant!
// Especially if you remove the terminating null!
  ...
strcmp(some_variable, "help"); 
// if compiler is "smart" enough to use the same memory to implement
// both instances of "help", you are screwed...

これは病理学的なケースおよび/またはガベージイン、ガベージアウトだと思います(「先生、頭を壁にぶつけると痛いです!」「それならやめてください!」)...

(ps私は問題を提起しているだけです-この投稿が水を濁らせていると感じた場合は、適切にコメントしてください。削除します)

于 2009-01-15T23:11:10.353 に答える