【C言語】練習1-21

4786 ワード

  • 題出所:『The C programming language』の練習問題
  • 練習1-21:プログラムentabを作成し、スペース列を最良数のタブとスペースに置き換えますが、単語間の間隔を維持します.

  • 考え方:
    タブの役割については練習問題1-20で説明しました.
    ここのテーマは、スペースの代わりに最小限のタブとスペースを使うことです.ここでは、以下のような状況に分けられます.
  • 文字がスペースの場合、現在のスペースの位置を判断し、現在の位置が8に対して余剰がゼロでない場合、nb++;現在の位置対8の余剰がゼロに等しい場合、ntab++、pos+、nbを0にします.
  • 文字が改行の場合、変数を空白にします.すなわち、nb=0、ntab=0、pos=0
  • です.
  • 文字が普通文字の場合、まずntabの値forに基づいてtをループ出力する.同様にnbの値に基づいてスペースをループ出力する.そして、現在の文字がtであれば、位置pos=pos+(ENTAB-pos%ENTAB)%ENTAB+1と判断する.そうでなければpos++にします.その後nbをゼロにする.現在の文字を出力します.

  • C言語コード実装:
    #include<stdio.h>
    
    #define ENTAB 8
    
    void main(){
        int c,nb,ntab,i,j,pos;
        nb = 0;
        ntab = 0;
        i = 0;
        j = 0;
        pos = 1;
        while((c=getchar()) != EOF){
            if(c == ' '){
                if(pos%ENTAB != 0){
                    nb++;
                }else{
                    ntab++;
                    nb = 0;
                }
                pos++;
            }else if(c == '
    '){ nb = 0; ntab = 0; i=0; j=0; pos = 1; putchar(c); }else{ for(;i<ntab;i++){ putchar('\t'); } for(;j<nb;j++){ putchar(' '); } if(c == '\t'){ pos += (ENTAB-pos%ENTAB)%ENTAB+1; }else{ pos++; } putchar(c); nb = 0; ntab = 0; i = 0; j = 0; } } }