2014-11-22 105 views
0

這個練習讓我發瘋。對不起,如果我的編程問題看起來很小,但我是初學者,所以請耐心等待。K&R練習1-18 C語言編程

練習請求以下內容: 編寫程序以刪除每行輸入中的尾隨空白和製表符,並刪除完全空白的行。

有人可以告訴我爲什麼我的代碼不起作用嗎?我還沒有解決完全空白行的問題,但我找不到任何理由說明爲什麼我的代碼不會刪除尾隨空白和製表符。那就是:

#include <stdio.h> 

#define MAXLINE 1000 

int better_line_length(char line[], int lim); 
void copy(char to[], char from[]); 

int main(void) 
{ 
    int len; 
    char s[MAXLINE]; 
    char better_s[MAXLINE]; 

    while ((len = better_line_length(s, MAXLINE)) > 0) { 
     copy(better_s, s); 
     printf("%s\n", better_s); 
    } 

    return 0; 
} 

int better_line_length(char s[], int lim) 
{ 
    int c, i, last_letter; 

    for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i) { 
     s[i] = c; 
     if (c != ' ' && c != '\t') 
      last_letter = i; 
    } 

    s[last_letter+1] = '\0'; 

    return last_letter+1; 
} 

void copy(char to[], char from[]) 
{ 
    int i = 0; 

    while ((to[i] = from[i]) != '\0') 
     ++i; 
} 

例如,我希望工作代碼如下:如果我的輸入是這樣的(其中「▯」表示空格):

abcdefg▯▯▯▯▯▯▯▯▯▯▯▯ 

我期望的輸出

abcdefg 

請注意,預期輸出後沒有空格。

但是,我得到的輸出是輸入的第一個字符的無限打印。

更新:當我從鍵盤輸入輸入時,我的代碼按預期工作,但是當從另一個文件中輸入輸入時,仍然會重複輸入一個字符。我的心被炸燬了。

+1

你有你的計算機上的調試器?一次運行您的代碼將顯示您出錯的位置。 – usr2564301 2014-11-22 23:52:04

+1

問問你自己'last_letter'對於'last last \ _letter + 1'有什麼價值?'當你給這個輸入提供* none *的字符時,需要將'last_letter'設置爲* anything *? (空格和製表符)?請注意,它沒有初始值。一旦你解決了這個問題,你仍然處於熱水中,除非'last_letter + 1'在某種程度上等於零。 – WhozCraig 2014-11-23 00:04:10

回答

2

的問題是你的這部分代碼:

while ((len = better_line_length(s, MAXLINE)) > 0) { 
    copy(better_s, s); 
    printf("%s\n", better_s); 
} 

它無限迭代作爲(len = better_line_length(s, MAXLINE))的結果總是大於0(字符串有至少1個字符)。

您不需要while循環。相反,像這樣做:

len = better_line_length(s, MAXLINE); 
copy(better_s, s); 
printf("%s|\n", better_s); 

(也注意到,您不使用任何地方len

+0

感謝您的幫助,但我仍然需要一個循環來輸入多行。 – jhschwartz 2014-11-23 00:13:13

+0

好吧,我以爲你只是想讀1行。 – syntagma 2014-11-23 00:16:45

+0

你實際上只是引導我回答我自己的問題,指出'(len = better_line_length(s,MAXLINE))'總是大於0. 非常感謝! – jhschwartz 2014-11-23 00:25:53