2016-02-29 90 views
1

我目前有一個問題取代gets()與fgets()。我已經看過了多個這樣做的例子,它看起來很直接,但是我在這樣做的時候會得到意想不到的輸出。在下面的註釋中使用gets()方法,我從我編寫的shell程序中獲得了良好的行爲,但是當我更改爲fgets()調用時,輸入「ls」時輸出「:no such file or directory」 。就像我說的,用gets()調用它工作正常。下面的代碼:C:錯誤替換gets()與fgets()

int main(void) { 

    while(1) { 
    int i = 0; 
    printf("$shell: "); 

    scanf("%s", first); 
    /* gets(input);*/ 
    fgets(input, sizeof(input), stdin); 

    //...parse input into tokens for exec system call... 

    execvp(first, args); 

    } 
    return 0; 
} 

回答

2

不像getsfgets將讀取換行符並將其存儲在的字符串中。

從手冊頁:

fgets()在大多數比大小的字符少了一個讀取流 並將它們存儲到緩存由s指向。在EOF或換行符後,閱讀停止 。 如果讀取換行符,則將其存儲到 緩衝區中。 A '\0'存儲在 緩衝區中的最後一個字符之後。

您可以通過替換它除去換行符(如果存在的話)將一個空字節:

fgets(input, sizeof(input), stdin); 
if (input[strlen(input)-1] == '\n') input[strlen(input)-1] = '\0'; 
+1

替代地清除換行符:'{字符* NL =和strchr(輸入,「\ N'); if(nl!= NULL)* nl ='\ 0'; }' – MikeCAT

+1

'輸入[strlen(input)-1]'將會讀出界限,如果空字符串被讀取(如果輸入流被耗盡,則會發生這種情況) –