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

何が間違っているか分かりますか?
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問でも出てきた「ヌル文字」ね。

ですね!……あれ?このループはとくに問題なさそうですよ。

ふふふ。それじゃあ、問題があるのはどの部分かしらね。

実際にコンパイルしてみれば分かるかも?