2017-07-28 53 views
1

我在使用fgets()讀取用戶輸入時出現問題,當我嘗試讀取輸入並點擊輸入時會影響下一個輸入,它會自動讀取新線性字符和混亂的一切。這裏有些人告訴我使用strcspn()函數來擺脫新的行字符。但它仍然不適合我。爲了更具體地說年齡字段是有問題的字段,我將年齡字符數組設置爲4,因爲最大年齡是3位數字,我們需要爲空字符額外的空間。當我在age字段中使用fgets()時,我還讀取了4個字符,年齡最多3個地方,字符串終止的最後一個地方,但它不起作用,我無法弄清楚如何修復它。使用fgets()從鍵盤讀取時從前面的輸入中讀取換行符

struct Person { 

    char name[20]; 
    char age[4]; 

}; 

int main(){ 

    vector<Person> v; 

    for (unsigned int i = 0; i < 5; i++) { 

     Person p; 
     printf("Enter a name and age:\n"); 
     printf("Name: "); 
     fgets(p.name, 20, stdin); 
     p.name[strcspn(p.name,"\n")] = '\0'; 
     printf("Age: "); 
     fgets(p.age, 4, stdin); 
     p.age[strcspn(p.age, "\n")] = '\0'; 


     v.push_back(p); 
    } 
} 
+2

這不是C,它是c。使用C構造++(矢量...)。 –

+0

@xing我是否需要更新fgets()和年齡數組容量,或者只是更新fgets()? – Keselme

+0

'int age; cin >>年齡;'? – JazzSoft

回答

0

fgets(char *str, int count, FILE *stream)讀取指定的文件流最多count - 1字符。然後fgets(...,4,...)從流中最多需要3個字符,這比讀取3位數字+一個新行少了一個。所以新的線路保持在流中,並在下一個fgets消耗,導致空的p.name。這可以通過使用age[5]fgets(...,5,...)來糾正。

但是,主要問題是,您的代碼容易受到「不正確」(即長)用戶輸入的影響,因此像"123 \n"這樣的輸入將再次導致意外的結果。爲了使它有點更穩定,可以接受在一個行更多的字符,但如果需要的話,然後截斷輸入:

void readin(char* dest, size_t destSize) { 
    char input[1000]; 
    fgets(input, 1000, stdin); 
    input[strcspn(input,"\n")] = '\0'; 
    strncpy(dest,input, destSize); 
    dest[destSize-1] = '\0'; 
} 

void main() { 
    ... 
    readin(p.name,20); 
    readin(p.age,4); 
    ... 
} 
+0

謝謝你的回覆,但如果我聲明一個大小爲1000的緩衝區,那麼當我最多需要20個例如,是不是認爲內存浪費? – Keselme

+0

緩衝區只是用於接管輸入的臨時內存,不是用於存儲(截斷的)值,所以它實際上不是浪費。在大多數系統中,通常不會將1000字節的臨時內存視爲任何問題。但你當然可以自由縮小尺寸...... –