テキストを大文字に変換するプログラムを作りました。コンパイルはできたのですが、実行してみると期待どおりの結果になりません。
何が間違っているか分かりますか?
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問でも出てきた「ヌル文字」ね。
ですね!……あれ?このループはとくに問題なさそうですよ。
ふふふ。それじゃあ、問題があるのはどの部分かしらね。
実際にコンパイルしてみれば分かるかも?