K&R演習[1-22]

課題

入力行を入力のn文字目までにある最後の非ブランク文字の後で折りたたむプログラムを書け。

私見

「折りたたむ」の意味が分からない。

方針

「折りたたむ」はブランク文字の削除を解釈する。

回答

#include <stdio.h>
#include <string.h>

typedef unsigned long int u8;
const int n = 10;
/**
 * @fn      Main
 * @brief
 * @param
 * @return
 * @detail
 */

int main(void)
{
    int c;
    char str[1000];
    u8 pos_org = 0, pos_blank = 0, pos_str = 0;

    while ((c = getchar()) != EOF) {
        if (pos_org == n) {         // 指定文字位置に達したら
            pos_str = pos_blank;    // 文字格納位置をブランク発見位置に変更する。
        }

        switch (c) {
            case ' ':
            case '\t':
                if (pos_blank == 0) {       // ブランク未発見なら
                    pos_blank = pos_org;    // ブランク発見位置を記録
                }
                str[pos_str] = c;           // 文字を格納
                pos_org++;      // 入力文字位置のインクリメント
                pos_str++;      // 格納文字位置のインクリメント
                break;

            // 改行
            case '\n':
                str[pos_str++] = c;     // 改行を格納
                str[pos_str] = '\0';    // 文末を格納
                printf("%s", str);          // 印字

                // 次に備えて初期化
                pos_str = 0;
                pos_org = 0;
                pos_blank = 0;
                break;

            // ブランクでも改行でもない
            default :
                pos_blank = 0;      // ブランク発見位置を初期化
                str[pos_str] = c;   // 文字を格納
                pos_org++;      // 入力文字位置のインクリメント
                pos_str++;      // 格納文字位置のインクリメント
                break;
        }
    }
}

実行内容

qw        as

実行結果

qwas