C聖書---入力行の末尾のスペースとタブを削除し、完全にスペースの行を削除します

3178 ワード

ソース
各入力行の末尾のスペースとタブを削除し、完全にスペースの行を削除するプログラムを作成します.
 
getline関数は、テキスト行を読み込んだときにその行の長さを返し、ファイル終了子に遭遇したときに0を返すことができます.
0は有効な行長ではないので、フラグファイルの終了フラグとすることができる.
行ごとに、少なくとも1文字を含み、改行のみを含む行の長さは1です.
 
 1.次のコードは、スペースやタブを本当に削除していないだけで、表示されないようにします.
#include
//#include
#define MAXLINE 1000
int getline(char s[], int lim);
int main(){
    int len,i;
    char line[MAXLINE];
    while( (len = getline(line,MAXLINE))> 0){     //            ,len         
        //printf("%s",line);
       for(i = 0; i < len; i++)  //      
         printf("%c",line[i]);
       //printf("
"); } //system("pause"); return 0; } int getline(char s[], int lim){ int i,j,len; char c; for(i = 0; i < lim - 1 && (c = getchar())!= EOF && c != '
'; i++) s[i] = c; if(c == '
'){ s[i] = c; i++; } s[i] = '\0'; len = i;//len // , , for(j = i - 1; j >= 0;j--){ if(s[j] != ' ' && s[j] != '\t') // , ' ' '\t' break; // , if(s[j] == ' ' || s[j] == '\t') // ' ' '\t', -- len--; } return len; }
2.本の答え
#include
#include
#define MAXLINE 1000
/*      ,                ,
                  
*/ 
int getline(char s[],int lim);
int remove(char s[]);
int main(){
    char line[MAXLINE];
    
    while( getline(line,MAXLINE) > 0){ //            
            if(remove(line) > 0)
               printf("%s",line);
  
   }
   system("pause");
  return 0;
} 
int getline(char s[], int lim){
    int i;
    char c;
    for(i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '
'; i++) s[i] = c; if(c == '
'){ s[i] = c; i++; } s[i] = '\0'; return i; } int remove(char s[]){ int i = 0; while(s[i] != '
') // '
','\0' i++; i--; //back off from '
' // ' ' '\t', i while( i >=0 && (s[i] == ' ' || s[i] == '\t' )){ i--; } //is it a noblank line? if(i >= 0){ // i>=0, , i++; s[i] = '
'; //put newline character back i++; s[i] = '\0'; //terminate the string } return i;// newline }
 
 
 
remove関数は、文字lineの末尾のスペースとタブを削除し、新しい長さを返します.
この長さ>0の場合、ラインにスペースやタブではない他の文字があることを示し、プログラムはこれを後で印刷します.
を選択します.そうしないと、この行は完全にスペースとタブで構成されていることを示します.プログラムはこの行を無視します.
 
remove関数はまず''を見つけます
その後、1つの位置を後退させ、その後、この関数は、スペースまたはタブではない文字を見つけるまで、後ろから前にチェックします(i<0)
i>=0の場合、少なくとも1つの文字があることを示し、その後、関数removeは改行文字と文字列終了文字を入力行に戻し、変数iを返します.