TechCraft – エンジニアのためのスキルアップメモ

エンジニアのスキルアップを少しでも加速する技術ブログ

C言語でHello World 普通と違うHelloWorldを作ろう!

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;
}
  • 解説putcharは引数に文字を取り、そのまま1文字出力します。
  • '\n' も文字リテラルですが、文字列リテラル("...")ではありません。

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言語は低レイヤー操作ができるからこそ、こうした「制限プレイ」も可能です。
基礎に慣れてきたら、遊びながら理解を深めてみるのもおすすめですよ!


参考リンク

参考書籍