0

私は次のようなことをしようとしています

strcmp(argv[3], "stdout")

ただし、コマンドラインで入力したくない

stdout\0

文字列リテラルの最後にある\0を取り除くための最良の方法は何ですか?

ありがとう!

アップデート:

みんなありがとう。私は自分のコードのどこが悪いのかを見つけました...私は使うべきでした

strcmp(argv[3], "stdout") == 0

ありがとう@NicolBolas

4

3 に答える 3

3

コマンドラインで「stdout\0」と入力する必要はありません。システムがコマンドライン引数をプロセスで使用できるようにする方法(オペレーティングシステムによって異なります)に関係なく、ヌル文字が自動的に追加されます。

ご存知のように、Cスタイルの文字列はヌル文字で終了します。ヌル文字はコードで「\0」と記述されます。その文字が文字列の最後にない場合、そのstrcmpような文字列は慣例を無視するため、などの関数は文字列の最後をはるかに超えて進み続けます。ただし、終了ヌル文字はC規則であるため、コンパイラは文字列リテラルの末尾にヌル文字を追加するのに十分スマートであり、システムは、に格納されているコマンドライン引数にヌル文字を追加するのに十分スマートです。新しく作成されたプロセスのメモリ。argcが3より大きい場合、プログラムのコマンドラインで入力する3番目の引数が "stdout"の場合、toを呼び出すとstrcmp(argv[3], "stdout")0が返され、2つの文字列が一致することを意味します。

于 2013-02-03T03:32:42.557 に答える
2

ほとんどの場合、入力する必要はありません\0。文字列リテラルには\0暗黙的に追加され、文字列データを文字配列に格納するC関数は最後にを追加します\0(そのため、これらの関数の多くのドキュメントでは、文字バッファに文字列とヌルターミネータ)。

于 2013-02-03T03:33:07.667 に答える
2

文字列リテラルは、二重引用符( ")で囲まれたソース文字セットの0個以上の文字で構成されます。文字列リテラルは、一緒になってnullで終了する文字列を形成する文字のシーケンスを表します。

strcmp は、各文字列の最初の文字の比較を開始します。それらが互いに等しい場合、文字が異なるまで、または終了するヌル文字に到達するまで、次のペアを続行します。

\0したがって、の最後に書き込む必要はstdoutありません。の戻り値をと比較する必要がありstrcmpます0

if (strcmp(argv[3], "stdout") == 0)
于 2013-02-03T03:38:20.667 に答える