はじめての C

C programming note*1
rmposblank() では うまく 動いてくれてますが、errata によると、そこで 使われる関数に 一部 不具合がある とのことです。

関数 remove_pos_blank(char *) において、元のコード (のまま) では、 「空白 もしくは タブの 連続 のみから なる行」 (つまり 1行 すべてが 空白 または タブである場合) において、次の部分で ポインタ q が buf[0] より前を 指してしまうという 問題が あります。

while (ISBLANK(*q))
--q;

これを 回避するために コードを 修正しました。

修正されたコードが こちらです、

void remove_pre_blank(char *buf)
{
char *q;

if (*buf == '\0')
return;

/* ポインタ q を '\n' の位置まで 移動させる */
q = buf + strlen(buf) - 1;
while (q > buf && ISBLANK(*(q - 1)))
--q;
*q = '\n';
*(q + 1) = '\0';
}

文字列の先頭で スペース または タブを 入力して、それを 取り消さずに 改行すると、確かに 「見えない文字だけの」 行が できてしまいます ... あり得ますね。

*1:「作ってわかる C プログラミング」