第26問

文字列を後方から1文字ずつ消去していくプログラムを作りました。正常に動作しているのですが、先々のことまで考えると直しておきたい部分があります。

どこを直すのがいいか分かりますか?
main.c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

bool delete(char *pText) {
  size_t length = strlen(pText);
  if (length > 0) {
    pText[length - 1] = '\0';

    return true;
  }

  return false;
}

int main(void) {
  char text[] = "Hello!!";
  while (delete(text)) {
    printf("deleted: %s\n", text);
  }

  return EXIT_SUCCESS;
}
実行結果
deleted: Hello!
deleted: Hello
deleted: Hell
deleted: Hel
deleted: He
deleted: H
deleted: 
今回のプログラムは、1つ前の問題より分かりやすいんじゃないかしら。
そうですね。解読してみます!
えっと、main()の内側にwhileがあって……
  char text[] = "Hello!!";
  while (delete(text)) {
    printf("deleted: %s\n", text);
  }
このdelete()っていう関数の処理が成功している間だけループして、テキストを表示してるんですかね。
そうそう。実行結果を見ると、テキストの変化が分かるわね。
そうですね。うしろから1文字ずつ消えていってます。
じゃあ、delete()関数の中身は……
bool delete(char *pText) {
  size_t length = strlen(pText);
  if (length > 0) {
    pText[length - 1] = '\0';

    return true;
  }

  return false;
}
これは、文字列の最後の1文字を'\0'、つまりヌル文字に置き換える処理で消してるんですね!
そうね。戻り値はどうなってるかしら?
はい。文字が消せたらtrue、消す文字がなければfalseになります!
これは、bool処理の成功・失敗を返しているということよ。
ふむふむ。だからwhileでループできるんですね。
そういうこと!それじゃあ、問題文に戻りましょうか。
そうでした。先々のことを考えて、どこを直すか?でしたよね。
今回のプログラムは、「C言語としては」正常に動作しますが……