2016-10-16 23 views
0

私は、行単位で読み込む非常に基本的なシェルを作っています。私はループに問題があります。 これが私のメインである:すべての行単位で読み込むシェル

int main(int argc, char* argv[]) { 
    char* av[ARGVMAX]; 
    int nArgs, i, j, k; 

    fflush(stdout); 
    while (fgets(line, LINESIZE, stdin) != NULL && line[0] != '\n') { 
    for(i = 0; line[i] != '\n'; i++) { 
     temp[i] = line[i]; 
    } 
    scanf("%d", &nArgs); 
    j = 0; 
    while(j<nArgs) { 
     temp[i++] = ' '; 
     scanf("%c", &temp[i++]); 
     j++; 
    } 
    makeargv(temp, av); 
    runcommand(av); 
    fflush(stdout); 
    } 
return 0; 
} 

まず、私は、他の言葉で、1つの全体に読み込まれているすべての単数形のラインをオンされてやろうと、「文字列」を読んで、それを入れています配列は、すべての単語を ''で区切ります。

私の問題は、プログラムが "scanf("%c "、& temp [i ++])"にあるときはいつも入力しても何も入力しないということです。ループの最初の回は、コードの行をスキップしますが、ループの他の入り口(2回目または3回目)には、私は何かを書くのを待ちます。

これはどういう意味ですか?私は何か間違っているのですか? ありがとうございます!

+0

私はあなたのコードを正しく読めば、入力の空ではない行をタイプして、数字を入力しなければなりません - 引数の数はNです。その数字の後ろにN個の単一文字が続く必要があります。それぞれの文字は引数になりますか?それは非常に快適なコマンドラインインターフェイスのように感じることはありません。あなたのコードには、バッファオーバーフローに対する保護がありません(ユーザーが999999999を入力するとどうなりますか?など)。私は、あなたが入力する必要があるものをもう一度考える必要があると思います。そして、答えの注釈として、 '%c'は数字の後の改行、スペース、コロン、または... –

答えて

1

線が

scanf("%d", &nArgs); 

は、入力バッファ内newlineままであり、これはフォーマット%d(最も形式)が、

scanf("%c", &temp[i++]); 

ラインによって読み取られた後、任意の先頭の空白を無視入力バッファーの%cは、spaceを次のように挿入しない限り表示されません。

scanf(" %c", &temp[i++]); 
// ^
+0

それは今作動します!!! –

+0

関数scanfの代わりに、関数fgetsを使用していたらどうなりますか? fgets関数でも同じことが考えられますが、どのように動かすことができますか? –

+0

'fgets'は常に' newline'を読み込みます(例えば、テキストファイルの最後の行に 'newline'がない場合など)。 –

関連する問題