さて、ここまで数値を扱った演算をたくさんしてきましたが、文字を扱った演算はしてきませんでした。なぜ今まで文字を扱わなかったのかといいますと、単純に難しいからです。気合入れて下さいね。

C言語に置いて、文字文字列は区別されます。文字列は文字の集合体です。つまり、1文字扱う場合と複数の文字を扱う場合で操作が異なるということです。
最も、1文字を文字列として扱うこともできますけどね。

文字を格納するには、charを使います。

char Character;
Character = 'a';


これで、文字型の変数Characterにaが代入されました。
文字を操作する際には、それが文字であることを明示する' '記号を付けることを忘れないで下さい。

それではサンプルコードにてCharacterの値を確認してみましょう。文字を変換するフォーマット指定子は%cです。

61


もちろん、char Character = 'a';と書くことも可能です。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
続いて文字列型を学習します……が、C言語に文字列型はありません!(C++にはあります)
なので、C言語で文字列型を扱う場合、ゴリ押しで扱うことになります。
ゴリ押しの方法は2種類あり、
・char型の変数を大量に用意する方法
・メモリ上に文字列を配置し、その領域のアドレスを参照する方法


の2種類があります。まず、char型の変数を大量に用意する方法をやってみます。


62


めんどうくさいですが、これなら Character3 へ '適当な文字'を代入すれば、 3文字目だけ変更するといった芸当も可能です。ゲームプログラムで例えれば、主人公の名前に応じてテキストを変更することもできますね。


63


でもなんだかやっぱり原始的というか、不格好というか、もう少し書きやすく書きたいですね。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ここで皆さんにお願いなのですが、ソリューション エクスプローラー→Source.cppを右クリックして
ファイルの拡張子を.cppから.cへ変更して頂けますでしょうか。
BlogPaint


BlogPaint


実は今までは.cppファイルにコードを記述してきました。
.cppとはC++の拡張子です。
つまり、今まではC++のプログラムを記述していたのです。

C++はCをほぼ完全に内包していますが、何箇所か互換性のない部分があります。
文字列型を学習するに辺り、C++では記述不可能な書き方を学習します。
なのでそのままだとコンパイルエラーとなるのです。

C++流の文字列型の学習はC++言語を学ぶ時に、改めて行って下さい。
また、C++でも通用するC流の文字列型の操作はこの後の講義でも行います。

ではこれからの講義に意味はないのかと問われるとそれは違います。
scanfの時と同じように、この後の基礎となりますのでしっかり学習して下さい。

scanfといい、文字列型といい、Cの使いにくい部分をさらけ出していますがC言語そのものの歴史は古く、2017年から数えて46年前の言語なのである種仕方のない部分でもあるのです。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
メモリ上に文字列を配置し、その領域のアドレスを参照する方法で書いてみます。


66


char* はchar型(文字型)のポインタ変数と言います。

char* が保存しているのはhelloという文字列ではなく、helloという文字列が配置されたメモリのアドレスです。

ポインタ変数とは、アドレスを保存する変数のことを指し、型名の後ろに*を付けて表現します。

C言語では、文字列は宣言した時点でどこかしらのメモリ上に配置されるので、その配置されたアドレスを把握しておけば文字列を擬似的に操作できるのです。
char* String = "hello";は、helloという文字列をメモリのどこかに格納し、そのアドレスをStringへ代入しているのです。
ちなみに文字列は ' ではなく、" で囲んで表現します。"a"は1文字ですが文字列扱いです。

もしここで、それならば文字列の先頭に&が必要なのでは? と考えた方は鋭いです。
しかし、そもそもchar* にはアドレスしか入らないことが自明なので、&で指定せずともコンパイラがアドレスを代入してくれるのです。

この方法の方がスマートな気がしますが、実はこの方法には弱点があります。
先の方法のように、文字列の一部を置換することができません。

ええ……と思うかもしれませんが、文字列が格納されるアドレスは読み取り専用領域なので、変更できないのです。この方法では参照しかできません。
なぜ読み取り専用領域へ格納されるかというと、文字列全体を定数として扱っているからです。先の方法では1文字を大量に並べていたので変更が可能だったのですが、今回の方法は文字列をまとめてメモリへ配置し、そのアドレスを参照しているので、アドレスしか見ることができない状態なのです。いわば文字列全体が1つの文字になっているような状態です。

この方法は、文字列を参照したい場合には非常に有効です。

実行結果
68

アルファベット表を作成し、何度か表示するプログラムなのですが、普通にprintfだけで表示するのはうんざりします。もしアルファベットの順番を間違えでもしていたら、全てのprintfを修正する必要があります。しかし、この文字列を参照する方法なら、マスタデータが一箇所にあるだけなので、修正は一箇所だけで済みます。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
しかしこの方法もまだ扱いやすいとは言えません。参照を使用する機会には有効ですが、もう少し柔軟に、具体的には好きな時に好きな箇所の文字を変更できるとなお良いですね。

では、再びお願いなのですが、ソリューション エクスプローラー→Source.cを右クリックして、ファイルの拡張子を.cから.cppへ戻して頂けますでしょうか。
70

BlogPaint


戻すと、プログラム自体がエラー扱いになります。C++とCの僅かな相違点です。
ちなみにC++でこの文字列を参照する方法を使う場合、char* の前にconstを付ければよいです。

const修飾子を付けた変数や関数や引数は参照専用となります。参照専用とは、その値を変更することができないということです。C++ではconstにて明示しなければ文字列を参照する方法は使えなくなりました。

72

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ところで、結局のところ一番最初に試したchar型を大量に作ってゴリ押す方法が最も柔軟でしたね。
C言語には文字列型がないので、このようにプログラマが苦労を強いられるのです。

しかしそれではあまりに忍びないので、次回は文字列を更に使いやすく操作し、かつC言語でもC++でも使用できる術式を披露したいと思います。