1

sscanfを使用したcでの解析に問題があります

read_line()という1つの関数を使用してコンソールでテキストを読みました

char cm1[100],cm2[100],cm3[100]
printf("Enter command:");
read_line(var_text);
/*var_text = cat /etc/passwd | cut -f1 d: | sort */
int num = sscanf(var_text,"%s | %s | %s",cm1,cm2,cm3);

var_text cat | cut | sort私がcm1リターンキャットをcm2リターンカットとcm3リターンソートで書くならOK 、しかし私が書くならcat /etc/passwd | cut -f1 d: | sort、cm1リターンキャットとcm2とcm3なし...

私はcでシェルを作成しました、そして私はコマンドと属性が必要です

すべての人にThx、そしてその悪い英語をお詫びします:)

4

1 に答える 1

4

フォーマット指定子は%s、最初の空白文字で処理を停止します。の場合:

猫 /etc/passwd | カット -f1 d: | 選別

catこれは、最初のが終了する の後のスペースになります%s。次に、フォーマット指定子は、存在せず、入力されていない を期待し|ます。scanset を使用してこれを実現できます。cm2cm3

if (3 == sscanf(var_text, "%99[^|]| %99[^|]| %99s", cm1, cm2, cm3))
{
}

幅指定子を使用してバッファ オーバーランを防止し、戻り値をチェックしsscanf()てすべてのターゲット変数が設定されたことを確認してください。

フォーマット指定子%99[^|]は、文字が検出されるまで、最大 99 文字 (ヌル ターミネータに対応するためのターゲット バッファ サイズよりも 1 つ少ない) を読み取ることを示しています|

http://ideone.com/Cz1Qefでデモを参照してください。

于 2013-01-10T15:53:13.023 に答える