2016-10-16 157 views
0

因此,我正在製作一個非常基本的shell,它可以逐行讀取內容,並且我遇到了有關循環的問題。 這是我的主:shell逐行讀取

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; 
} 

首先,我想要做的是把該讀成一個整體,由換句話說每一個奇異線,讀一「串」,並把它在數組,用「'分隔每個單詞。

現在我的問題是,無論程序何時在「scanf(」%c「,& temp [i ++])」他不讓我在第一時間輸入任何內容,這意味着只要我輸入循環第一次他跳過那行代碼,但在循環的其他入口(第二次或第三次),他等着我寫東西。

這是什麼意思?難道我做錯了什麼? 預先感謝您!

+0

如果我正確讀取你的代碼,用戶鍵入一個非空行輸入,然後必須鍵入一個數字 - 這是參數的數量,爲了簡潔起見,而且這個數字後面必須跟着N個單個字符,每個字符都會變成一個參數?這不像一個非常愉快的命令行界面。你的代碼還缺乏對緩衝區溢出的保護(如果用戶輸入999999999作爲數字呢?)等。我認爲你需要再次考慮你要求用戶輸入的內容。而且,正如答案所指出的那樣,'%c'將在數字,空格或冒號後面讀取換行符,或者... –

回答

1

scanf("%d", &nArgs); 

後仍然在輸入緩衝器中的newline,這由線

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

雖然格式%d(和大多數格式)忽略任何前導空白讀在輸入緩衝區中,%c沒有,除非你插入一個這樣的space

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

它現在正常工作! –

+0

如果不是函數scanf而是我正在使用fgets函數呢? 它仍然在fgets函數中做同樣的想法,我如何才能使它工作? –

+0

'fgets'總是讀取'newline'(如果存在的話,例如文本文件中的最後一行可能沒有'newline')。 –