第22問

テキストを大文字に変換するプログラムを作りました。コンパイルはできたのですが、実行してみると期待どおりの結果になりません。

何が間違っているか分かりますか?
main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

const char *ToUpperText(const char *pText) {
  size_t length = strlen(pText);
  char UpperText[length + 1];

  for (int i=0; i<length; i++) {
    UpperText[i] = toupper(pText[i]);
  }
  UpperText[length] = '\0';

  return UpperText;
}

int main(void) {
  char text[] = "The C Programming Language";
  puts(text);
  puts(ToUpperText(text));

  return EXIT_SUCCESS;
}
期待される実行結果
The C Programming Language
THE C PROGRAMMING LANGUAGE
このプログラムを実行すると、表示がおかしくなるってことですか?
そうね。最悪の場合は、クラッシュしてしまうかも。
じゃあ、クラッシュしないプログラムに直せばいいんですね。
そういうことよ。
えっと、怪しいのはこの関数かな……
const char *ToUpperText(const char *pText) {
  ……
}
関数名がToUpperText()だから、これがテキストを大文字に変換する関数ですね。
そうそう。引数で受け取った文字列を、大文字の文字列に変換して返す仕様になってるわね。
関数の中身は……
  for (int i=0; i<length; i++) {
    UpperText[i] = toupper(pText[i]);
  }
  UpperText[length] = '\0';
ふむふむ。forループで1文字ずつ大文字に変換して、最後に'\0'を付けてるんですね。
'\0'は、第17問でも出てきた「ヌル文字」ね。
ですね!……あれ?このループはとくに問題なさそうですよ。
ふふふ。それじゃあ、問題があるのはどの部分かしらね。
実際にコンパイルしてみれば分かるかも?