go-printf - 課題

プロジェクト概要

go-printf は、C言語の printf 関数を Go で再実装する課題です。フォーマット指定子の解析と、様々な型の値を文字列に変換する処理を実装します。

提出ファイル

go-printf/
├── go.mod
├── printf.go         # メイン実装
├── printf_test.go    # テスト
└── printf_bonus.go   # ボーナス(オプション)

マンダトリー要件

実装する関数

// Printf はフォーマットに従って標準出力に出力し、書き込んだバイト数を返す
func Printf(format string, args ...interface{}) int

// Sprintf はフォーマットに従って文字列を生成して返す
func Sprintf(format string, args ...interface{}) string

サポートするフォーマット指定子

指定子 説明
`%c` 文字(rune) `'A'` → `A`
`%s` 文字列 `"hello"` → `hello`
`%d` 10進整数 `42` → `42`
`%i` 10進整数(%d と同じ) `42` → `42`
`%u` 符号なし10進整数 `42` → `42`
`%x` 16進数(小文字) `255` → `ff`
`%X` 16進数(大文字) `255` → `FF`
`%o` 8進数 `8` → `10`
`%b` 2進数 `5` → `101`
`%p` ポインタ `0x1234abcd`
`%%` パーセント記号 `%`

フラグ

フラグ 説明
`-` 左寄せ
`0` ゼロ埋め
`+` 正の数にも符号を表示
` ` 正の数の前にスペース
`#` 代替形式(0x, 0o など)

幅と精度

Printf("%10d", 42)      // "        42" (幅10)
Printf("%-10d", 42)     // "42        " (左寄せ)
Printf("%010d", 42)     // "0000000042" (ゼロ埋め)
Printf("%.5d", 42)      // "00042" (精度5)
Printf("%10.5d", 42)    // "     00042" (幅10, 精度5)
Printf("%*d", 10, 42)   // "        42" (幅を引数で指定)
Printf("%.*d", 5, 42)   // "00042" (精度を引数で指定)

ボーナス要件

浮動小数点サポート

Printf("%f", 3.14159)   // "3.141590"
Printf("%.2f", 3.14159) // "3.14"
Printf("%e", 1234.5)    // "1.234500e+03"
Printf("%E", 1234.5)    // "1.234500E+03"
Printf("%g", 0.0001234) // "0.0001234" または "1.234e-04"

カラー出力

Printf("{red}Error:{reset} %s\n", msg)
Printf("{green}Success!{reset}\n")

禁止事項

  • fmt パッケージの使用禁止
  • strconv.FormatInt, strconv.FormatFloat の使用禁止
  • 外部ライブラリの使用禁止
  • 実装上の注意

  • 引数の型チェック: interface{} からの型アサーションを正しく行う
  • エッジケース: 負数、ゼロ、最大値のテスト
  • メモリ効率: 不要な文字列連結を避ける
  • エラー処理: 不正なフォーマット指定子は %!指定子(型=値) 形式で出力