C言語で「特殊なHello World」 – 文字列を書かずに出力してみよう
1. はじめに
C言語で最初に学ぶのは「Hello, World!」の出力。
通常は以下のようなコードで表示します:
#include <stdio.h> int main() { printf("Hello, World!\n"); return 0; }
しかし、この記事ではあえて「文字列リテラルを書かずに」Hello, World!を出力する、ちょっと変わったCの書き方に挑戦します。
2. 目標:文字列リテラル無しでHello, World!を出力
条件:
- printf("Hello, World!\n");
のような文字列リテラル("..."
)を使わない
- 一文字ずつ出力、または数値から文字を構築
3. 方法1:putchar
で1文字ずつ出力
#include <stdio.h> int main() { putchar('H'); putchar('e'); putchar('l'); putchar('l'); putchar('o'); putchar(','); putchar(' '); putchar('W'); putchar('o'); putchar('r'); putchar('l'); putchar('d'); putchar('!'); putchar('\n'); return 0; }
4. 方法2:ASCIIコードを使って出力(完全数値化)
#include <stdio.h> int main() { int h[] = {72,101,108,108,111,44,32,87,111,114,108,100,33,10}; for(int i = 0; i < sizeof(h)/sizeof(int); i++) { putchar(h[i]); } return 0; }
- 解説:ASCIIコードに変換した数値を配列で持ち、それを
putchar
で出力しています。 - 例:
72
→'H'
、10
→ 改行文字
5. 方法3:ポインタを使って自己生成(少しトリッキー)
#include <stdio.h> int main() { char h[] = {72,101,108,108,111,44,32,87,111,114,108,100,33,10,0}; char *p = h; while(*p) { putchar(*p++); } return 0; }
- 文字列としてではなく、バイト列(char配列)+ヌル終端(0)で管理。
printf
を使わず、直接文字出力。
6. おまけ:関数ポインタを使ってHelloを出力
#include <stdio.h> void H() { putchar(72); } void e() { putchar(101); } void l() { putchar(108); } void o() { putchar(111); } void comma() { putchar(44); } void space() { putchar(32); } void W() { putchar(87); } void r() { putchar(114); } void d() { putchar(100); } void excl() { putchar(33); } void nl() { putchar(10); } int main() { void (*msg[])() = { H,e,l,l,o,comma,space,W,o,r,l,d,excl,nl }; for (int i = 0; i < sizeof(msg)/sizeof(msg[0]); i++) { msg[i](); } return 0; }
- 高度な遊び:関数ポインタを使って文字を出力。ロジックとデータの分離。
7. まとめ
方法 | 特徴 |
---|---|
putchar 連続呼び出し |
一番簡単な文字列なしの方法 |
ASCII配列 + ループ | コンパクトで効率的、構造的 |
ポインタで自己出力 | *p++ パターンでCらしさ全開 |
関数ポインタ | 少し変態的だが楽しい表現 |
C言語は低レイヤー操作ができるからこそ、こうした「制限プレイ」も可能です。
基礎に慣れてきたら、遊びながら理解を深めてみるのもおすすめですよ!
参考リンク
参考書籍
リンク
リンク
リンク