引用符なしで文字列を出力するCプログラムの書き方
C言語には一風変わった課題がいくつかありますが、そのひとつが「引用符(ダブルクォーテーション)を一切使わずに文字列を出力する」というものです。通常、文字列リテラルを扱うには "Hello World" のように引用符で囲む必要がありますが、本記事ではマクロ関数を活用することで、これを実現する方法を解説します。
マクロ関数による文字列化の仕組み
ポイントとなるのは、次のようなマクロ定義です。
#define getString(x) #x
getString() はマクロ関数であり、引数 x を文字列に変換して返します。x の前に付けている # は、Cプリプロセッサにおける文字列化演算子(stringize operator)と呼ばれるもので、「この引数を文字列リテラルへ変換せよ」という指示を意味します。
つまり、getString(Hello World) と書くだけで、プリプロセッサがコンパイル時に自動的に "Hello World" という文字列リテラルへ置き換えてくれるのです。
処理の流れ(アルゴリズム)
ステップ1:引用符なしの文字列を用意する ステップ2:マクロ関数を使って文字列として出力する ステップ3:終了
- 入力: 引用符で囲まれていない文字列を1つ受け取る
- 出力: その文字列をコンソールに表示する
サンプルコード
#include<stdio.h>
#define getString(x) #x
// # が x を文字列に変換する
int main(void) {
printf(getString(Hello World));
return 0;
}
実行結果
Hello World
解説
このプログラムでは、printf() の引数として直接文字列リテラルを渡す代わりに、getString(Hello World) を指定しています。コンパイルの前段階であるプリプロセスの時点で、# 演算子によって Hello World というトークン列が "Hello World" という文字列リテラルに変換されるため、ソースコード上には引用符が一切現れません。
なお、空白を含む引数もそのまま1つの文字列として扱われる点が特徴的です。このテクニックは、デバッグ用に変数名や式を文字列として出力したい場合などにも応用できます。
-
【Python】ループを使わずに数列を出力する方法:再帰呼び出しを活用した実装
はじめに 本記事では、以下の問題に対する解決策について詳しく解説します。 問題の概要 2つの整数 N と K が与えられたとき、N が 0 より大きい間は N から K を引き続けます。そして N が 0 以下になったら、今度は元の値 N に戻るまで K を足していきます。 入力例 N = 10 K = 4 出力例 10 6 2 -2 2 6 10 アルゴリズムの考え方 N が 0 より大きい間、関数を再帰的に呼び出し続けます(各呼び出しごとに N から K を減算します)。 数値が 0 以下になったら、元の値に戻るまで各呼び出しごとに K を加算します。 加算と減算は同じ1つの関数
-
ループを使わずに数列を出力するPythonプログラム|再帰とフラグで実現する方法
本記事では、for文やwhile文などのループ構文を一切使わずに数列を表示するという問題の解法について解説します。問題の定義問題: 2つの数値 N と K が与えられます。まずNが0より大きい間はNからKを繰り返し引き、Nが0以下(ゼロまたは負)になったら、今度は逆にKを足していきます。そして値が元の数値Nに戻った時点で処理を終了します。実行例N = 10K = 4出力: 10 6 2 -2 2 6 10アルゴリズムNが0より大きい間、関数を再帰的に呼び出し続けます。各呼び出しのたびにNからKを減算します。数値が0以下になったら加算モードに切り替え、各呼び出しごとにKを加算します。元の数値Nに