1

私はCでミニシェルを作成しています。私は、環境変数を考慮しているところです。ユーザーから元の入力行を取得し、それを関数に渡します。

int expand(char *orig, char *new, int newsize)

ここで、newは固定長のchar配列です。$ {が見つかるまでorigをループし、getenvを使用して変数の値を見つけます。実際に値がある場合は、それをnewにコピーするだけです。ただし、値がなく、getenvがnullを返すと、問題が発生します。

私の先生は私にヌル文字を挿入するように言ったが、これは私には意味がなく、彼は別の意味を持っていたと思う。ヌル文字をorigに挿入する場合、それを引数に解析すると、ヌル文字が文字列の終わりを示していると見なされ、それ以上の引数を探す必要はありません。

たとえば、次のようなセッションに参加した場合:

echo ${USER} ${NOTHING} ${TERM}

それで:

orig = "echo ${USER} ${NOTHING} ${TERM}\0"

new = "echo my_user_name \0 xterm\0"

出力は次のようになります。

my_user_name 

my_user_nameが最後の引数であると見なされるため、xtermを引数リストに読み込む前にnullターミネータがあることを確認します。

これは漠然とした質問ですが、ミニシェルの作成にかなりの経験があり、この問題が通常どのように対処されるかを知っている人もいると思います。

4

1 に答える 1

1

おそらく、彼はnull文字列を挿入することを意味していました。つまり、変数を何も置き換えないでください。それが/bin/shが行うことです。

$ echo "hi $joe how are you"
hi  how are you

ヌル文字は値が0の文字です。通常は。と表記され'\0'ます。ご存知のように、それはCの文字列の終わりのマーカーです。

null文字列は、空文字列とも呼ばれます。です""。Cでは、次のように、長さ0、1バイトの文字配列で表されます。

char str[1] = {'\0'};

しかし、概念的には、文字を含まない一意の文字列です。

個人的には、null文字列ではなく空文字列と呼ぶ方が好きです。ヌルはそのような使い古された言葉です。ヌル文字。ヌルポインタ。

于 2012-10-17T02:19:29.067 に答える