2015-06-08 27 views
1

任務是從輸入行的末尾刪除空格和製表符,以保持行數。不能使用字符串庫。我已經完成了我所能做的所有工作,仍然在輸出文件中,在第一行的末尾有0920(使用八進制轉儲od -x trim.out)任何想法還有什麼可能是錯誤的?尾行字尾仍然在第一行的末尾給出0920

#define LINELIM 1000 

int getLine(char s[], int lim); 

int main (void){ 
    int len, i; 
    char line1[100]; 

    while ((len = getLine(line1, LINELIM)) >0){ 
      for (i=len-2; i>=0; i--){ 
      if (line1[i] == ' ' || line1[i] == '\t' || line1[i] == '\n'){ 
        // professor says it is always true for some reason 
       line1[i] = '\0'; 
      } 
      else break; 
     } 

    if(line1[0]) // not a blank 
     printf(" %s\n", line1); 
    } 

return 0; 
} 
/*getline: read a line into s, return length*/ 
int getLine(char s[], int lim){ 
    int c,i; 
    for (i=0; i<lim-1 && (c=getchar())!= EOF && c!='\n'; ++i) 
     s[i]=c; 
    if (c == '\n'){ 
     s[i] = c; 
     ++i; 
    } 
    s[i] = '\0'; 
    return i; 
} 
+6

這是什麼?使用'line1 [100]'',你正在傳遞'#define LINELIM 1000' ??? \ –

+4

有時間學習如何使用調試器,因爲那樣你可以逐行瀏覽代碼,看看會發生什麼,並檢查變量的值和表達式的結果。 –

+0

我想建議你嘗試一種不同的方法:首先 - 用'scanf'在一個步驟中讀取整行,然後應用替換邏輯。第二 - 重寫你的代碼,它看起來很可怕並且不能真正維護(我保證你:在兩天內你再也不會理解你的優點了)。第三 - 在你的代碼中有一個巨大的錯誤,你可能會寫出你的數組的邊界 - 請參閱getLine函數的第三行。因此,重新思考問題/方法在這裏會更好。 – ckruczek

回答

1

起初,你必須包括報頭<stdio.h>

#include <stdio.h> 

如果調用函數以等於LINELIM

getLine(line1, LINELIM) 

然後line1具有第二參數與定義相同尺寸

char line1[LINELIM]; 

至於我,我會重寫功能getline以下方式:)

int getLine(char s[], int lim) 
{ 
    int c; 

    int i = 0; 

    while (i < lim - 1 && (c = getchar()) != EOF && (s[i++] = c) !='\n'); 

    s[i] = '\0'; 

    return i; 
} 

在主主循環可以這樣寫

while ((len = getLine(line1, LINELIM)) > 0) 
{ 
    int i = len; 

    while (i != 0 && (line1[i-1] == ' ' || line1[i-1] == '\t' || line1[i-1] == '\n')) --i; 

    line1[i] = '\0'; 

    if (line1[0]) printf("%s\n", line1); 
} 

您應該從主要移動內部的i聲明while循環,因爲除了while循環,變量在main中的任何地方都沒有使用。

至於你的代碼,然後設置ilen - 2是不正確的。

for (i=len-2; i>=0; i--){ 
    ^^^^^^ 

讓我們假設line1僅包含新行字符'\n'。在這種情況下,len等於1,因此我將等於-1。所以尾隨的新行字符不會被刪除。

+0

感謝您花時間解釋,我真的很感激。 1。getline函數的是任務的一部分(不能改變) 2.我試圖宣佈INT I內用於和gcc抱怨ANS說,通過新的標準只聲明輸出側; -/ 3.的len的問候-2邏輯我以爲那個行結束符\ o也算?如果它不是,我的路線是錯誤的。 –

+0

@Oleksandr Pimenov函數getline不包括終止零。至於在循環中聲明變量i,它會顯示在我的文章中。編譯器都不會發出錯誤。 –