テキストを指定の文字数で切り詰めて表示するプログラムを作りました。このプログラムは正常に動いているように見えることもありますが、実際には重大な誤りを含んでいます。場合によっては、クラッシュしてしまうかもしれません。
![](/wp-content/include/images/avatar/teacher/5.png)
どこが間違っているのか分かりますか?
main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void PrintTruncated(const char *text, size_t length) {
char truncatedText[length];
strncpy(truncatedText, text, length);
printf("length = %zu: %s\n", length, truncatedText);
}
int main(void) {
for (int i=4; i<=8; i++) {
PrintTruncated("Hello!", i);
}
return EXIT_SUCCESS;
}
期待される実行結果
length = 4: Hell
length = 5: Hello
length = 6: Hello!
length = 7: Hello!
length = 8: Hello!
![](/wp-content/include/images/avatar/teacher/2.png)
切り詰められた文字列を
strncpy()
で作っているのが分かるかしら?
![](/wp-content/include/images/avatar/student/2.png)
はい。そこは分かったんですけど……。
![](/wp-content/include/images/avatar/teacher/4.png)
質問がありそうね?ただいま受け付け中よ。
![](/wp-content/include/images/avatar/student/4.png)
それじゃ、遠慮なく。配列の長さを変数で指定してるところがありますよね?
![](/wp-content/include/images/avatar/student/7.png)
truncatedText
の長さが固定値じゃなくてlength
になってるけど……。
char truncatedText[length];
![](/wp-content/include/images/avatar/student/2.png)
配列の長さって、固定値じゃなくてもいいんですか?
![](/wp-content/include/images/avatar/teacher/3.png)
いいのよ。これは「可変長配列」というやつね。
![](/wp-content/include/images/avatar/student/3.png)
へぇー!そんな機能があるんですね。
![](/wp-content/include/images/avatar/teacher/6.png)
じゃあ、それをふまえて何が問題か考えてみてね。
![](/wp-content/include/images/avatar/student/4.png)
はーい!
![](/wp-content/include/images/avatar/teacher/7.png)
strncpy()
の仕様を確認してみましょう。