わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

文字の足し算

いきなりですが問題です.

char c = 'A' + ' '; としたとき,c はどんな文字と等しいでしょうか?

もちろん文字コードはASCIIという前提で.
答えはこんな感じ.

ASCII文字コードによると,'A' は 0x41 と,' ' は 0x20 と等しい.これらを足すと,0x61 となる.これは,ASCII文字コードによると,'a' と等しい.したがって変数 c には,'a' と等価な整数値が代入される.

この問題を求めるためのキーになるのは,「Cでは,文字は整数値として表現される」という事実です.
ただしこの問題,実用上からは問題があります.前にポインタの足し算をしてはいけないという主張をしましたが,「文字と文字を足す」ことの実用性,必要性がよく分かりません.char c = 'A' + 0x20; とするのなら,何らかの意味づけができるかもしれません.それと,「大文字を小文字にする」というのであれば,tolower を使うべきですね.
これを踏まえて,もう一つ問題を.

2文字を「くっつける」形での足し算を実現するには,どう書けばいいでしょうか?
具体的には,char c1 = 'A', c2 = 'Z'; α; char *p = β; γ; として,ポインタ変数 p が文字列 "AZ" を参照するようにするには,α,β,γにどんな処理や式を書けばいいでしょうか?

もちろんβに"AZ"と書けるのなら簡単ですが,c1やc2がどんな値であってもうまくいくようにしましょう.
答えですが,配列とポインタ,そこでの文字列の表現をきちんと学んでいれば,こう書くのが模範解答でしょう.

αは,char str[3]
βは str
γは,str[0] = c1; str[1] = c2; str[2] = '\0'

別解もあります*1

αは,char str[3]
βは str
γは,sprintf(str, "%c%c", c1, c2)

ライブラリ関数の sprintf は,新たな文字列を作る際に便利なので,使いこなせるようになりたいです.ただし,実用としては,文字列と文字列をくっつけることに用いられることが多く,そのときには "%c%c" に替えて "%s%s" を用います.
ちなみに,文字列を「くっつける」ことは,「連結(concatenation)」と言います.

*1:さらに別解として,malloc で文字配列の領域を確保して p がそれを指し示すようにする,というのがあります.文字数は実行時に決められるというメリットがありますが,malloc の戻り値が NULL でないことを確認する処理を忘れないようにしましょう.