2014-09-01 34 views
2

請注意,Stack中還有一個類似於我的問題,但這個問題實際上提出了兩個問題。其中一個問題與我的問題無關,而且是唯一回答的問題。練習5.1在K&R中的用法c

我也會問一個不同的問題。它可以在下面找到:我想通過指針存儲在數組中的零怎麼辦?


的鍛鍊給我一個函數,int getint(int *),這需要一個數組元素的地址,ASCII數字從輸入流轉換,然後將它們存儲作爲INT指針的十進制數。如果下一個輸入不是數字,則返回EOF,如果輸入包含有效數字,則返回正值。該功能包含一個功能ungetch(),它將字符推回到輸入流。

我不明白下面的練習中的措辭:

書面,getint治療+或 - 不是後面跟着一個數字作爲零的有效表示。修復它推回這樣的字符回輸入

這是說我應該推+或 - 回到輸入流或推動不是數字的字符回到輸入流?另外,我應該如何通過指針處理存儲在數組中的零?

下面是代碼:

int getint(int *pn) 
{ 
    int c, sign; 

    while (isspace(c = getch())) 
     ; 
    if (!isdigit(c) && c != EOF && c != '+' && c != '-'){ 
     ungetch(c); 
     return 0; 
    } 
    sign = (c == '-') ? -1 : 1; 
    if (c == '+' || c == '-') 
     c = getch(); 
    for (*pn = 0; isdigit(c); c = getch()) 
     *pn = 10 * *pn + (c - '0'); 
    *pn *= sign; 
    if (c != EOF) 
     ungetch(c); 
    return c; 
} 
+1

K&R的問題是鼓勵人們編寫像上面這樣的代碼。 – 2014-09-01 18:46:13

+0

它有什麼問題?你會讓我做什麼?我只是用這本書學習編碼和語言。 – Spellbinder2050 2014-09-01 18:51:25

+0

問題在於,該書過於令人難以置信,語言及其使用(根據最佳實踐等)自寫入以來發生了很大變化。我強烈建議您從以下列出的「初學者」書籍之一學習:http://stackoverflow.com/a/562377/129570 – 2014-09-01 18:53:22

回答

2

的行使問你要認識到在我們的計劃 個微妙的問題,當你遇到一個「+」或「 - 」,但接踵而來的是不是一個數字。

例如,

+<EOF> 
+apple 
-banana 

與之相對實際的數字,像

+1 
-17 

在目前的程序,如果你看到的數據流中在前一種情況下,你是 消費「+ '和' - ',然後告訴用戶您看到一個 中的數字,並且該數字爲0.但這根本不是真的!

這是說我應該把+或 - 推回到輸入流或推回不是數字的字符回到輸入流?

想想你會期望作爲這個功能的消費者。就像我們的 所說,一個同事給了你這個功能,你必須使用它。你想 想要發生什麼?確實有兩種選擇:

  1. 從數據流中消耗「+」或「 - 」並丟棄它。告訴呼叫者 您沒有看到數字的返回值。

  2. 將「+」或「 - 」放回數據流中。告訴來電者,您沒有看到號碼 。

機會是,你想要的功能扔掉,它沒有 使用的數據。如果你通過一個字符串函數與這樣的文字:

++var; 

是否確定要消耗「+」和剛剛離開+var;?我不這麼認爲。

因此,要直接回答您的問題,請將'+'或' - '推回到流中。 確保已將全部個字符放回到您取出的數據流中。返回給用戶的代碼表明流中的內容不是 號碼。

另外,我應該如何處理通過指針存儲在數組中的零?

你不會!如果你沒有看到一個號碼,爲什麼你告訴來電者你 看到了數字0?如果 沒有看到數字,請更改代碼,以便在數組中不設置「0」。

(這個人是多了幾分曖昧。你可以記錄等功能,來電者必須把pn垃圾,如果你返回EOF或0。然後,你可以寫任何你想pn只要簡單地返回0 。但是,如果你不需要修改這個功能,你可以根本不碰pn,這是一個很好的練習。)