The C Programming Language練習問題1-21


練習1-21
プログラムentabを作成し、スペース列を最小数のタブとスペースに置き換えますが、単語間の間隔を維持します.タブ終了ビットの位置は,練習1−20のdetabプログラムの場合と同じであると仮定する.1つのタブまたはスペースを使用して次のタブ終了ビットに到達する場合、どの置換文字を選択すればよいですか?
タイトル分析この練習問題では、文字列のスペースキーを最小のタブとスペースの組み合わせに置き換える必要があります.Windowsのデフォルトタブは8文字のスペースを占めています.たとえば、15文字のスペースがある場合は、2つのタブと1つのスペースで置き換えます.
プログラミングの考え方1.入力文字がスペースかどうかを一字ずつ判断し、そうでなければ直接出力します.2.スペースが表示されたら、スペースカウントに1を追加し、読み取りを返します.スペースでない場合は、スペース数が0より大きいかどうかを判断し、いくつかのタブといくつかのスペースを計算して出力し、出力が完了したら、スペースカウントをゼロにし、最近読んだこの非スペース文字を出力します.スペースでない場合は、改行するかどうかを判断し、改行する場合はスペースの数をゼロにします.いずれもそうでない場合は、文字を直接出力します.3.判断を続ける.
プログラム実装部
int main()
{
int spacenum;   /*            */
int tabnumfinal;     /*            */
int spacenumfinal;  /*           */
char c;

spacenum = tabnumfinal = spacenumfinal = 0;
while ((c = getchar()) != EOF)
{
    /*       ,  spacenum 1 */
    if ( c == ' ') spacenum++;
     /*         ,  spacenum  0,              
                ,     */
    else if ( spacenum > 0 )
        {
        tabnumfinal = ( spacenum / DEFAULTTABNUM );
        spacenumfinal = ( spacenum % DEFAULTTABNUM );
        while (tabnumfinal > 0)
            {
            putchar('\t');
            tabnumfinal--;
            }
        while (spacenumfinal > 0)
            {
            putchar(' ');
            spacenumfinal--;
            }
        spacenum = 0;
        putchar(c);
        }
    /*        spacenum   */
    else if ( c == '
') spacenum = 0; /* , =0, , */ else putchar(c); } return 0;

}
実行結果
  :aaaa    bcd        efgh         abcdef                 ghijklmn
  :aaaa    bcd     efgh     abcdef          ghijklmn

おかしいですね.コードの「t」をアルファベットt、「」を*に置き換えます.タブとスペースの数の計算は間違いありませんが、出力が間違っていて、問題がどこにあるのか、模索中です.の
  :aaaa    bcd        efgh         abcdef                 ghijklmn
  :aaaa****bcdtefght*abcdeftt*ghijklmn