2011-08-13 36 views
0

開始行と終了行に空白を入れずに行を印刷しようとしています。 エンドからの削除がうまくいかない理由がわかりません。行末の空白を削除する

#include <stdio.h> 

#define MAX_LINE_LENGTH 1000 

#define LINE_BEGIN 0 
#define LINE_MIDDLE 1 
#define INBLANK 2 


void deleteBlankFromEnd(char line[], int offset); 
void deleteLine(char line[], int offset); 

main() 
{ 
    int c, i, status ; 
    i = status = 0; 
    char line[MAX_LINE_LENGTH]; 
    while((c = getchar()) != EOF) { 
     if (c == ' ' || c == '\t') { 
      if (status == LINE_MIDDLE || status == INBLANK) { 
       line[i++] = c; 
       if (status == LINE_MIDDLE) 
        status = INBLANK; 
      } 
     } else if (c == '\n') { 
      if (status > 0) { 
       if (status == INBLANK) { 
        printf("Line length = %d ", i); 
        deleteBlankFromEnd(line, i); 
       } 
       printf("%s", line); 
       printf("End\n"); 

       deleteLine(line, i); 
      } 
      i = 0; 
      status = LINE_BEGIN; 
     } else { 
      line[i++] = c; 
      status = LINE_MIDDLE; 
     } 
    } 
} 

void deleteBlankFromEnd(char line[], int offset) { 
    while (line[offset] == ' ' || line[offset] == '\t') { 
     line[offset--] = 0; 
    } 
    printf("Line length = %d ", offset); 
} 

void deleteLine(char line[], int offset) { 
    while (offset >= 0) { 
     line[offset--] = 0; 
    } 
} 

答えて

1

オフラインでのインデックス作成エラーのようです。最初のオフセットの文字が空白スペースまたはタブでない場合、deleteBlankFromEndは何も行いません。それが何であるかを調べてみてください。 --i

1

あなたはdeleteBlankFromEndに渡されますが、あなたのケースでは入力の長さに等しいオフセットが間違っています。これによって、あなたは、ここでは範囲外の実際にあるコンテンツにアクセスしようとしている:

while (line[offset] == ' ' || line[offset] == '\t') 

方が良い以下のようなdeleteBlankFromEndを呼び出すために:第二引数は文字列の最後の文字を指します

deleteBlankFromEnd(line, i-1); 

関連する問題