[前へ]   [目次へ]   [次へ]

文字列(C/C++)


   (05/11/17) %s変換についての表記が"abcde"を渡した時の解説で、ソースと対応していなかった点を修正

今回は文字列について解説しようと思います。

まず重要な点として、C言語には「文字列型」というものが標準にありません。
C言語で文字列を扱う場合は char 型の配列を用います。

組み込みの文字列型が存在しない以上、その扱いは文字列型を持つ言語に比べると厄介です。
しかし、その反面、文字列型でしか文字列を扱えない言語ではできない操作を実行できます。

一言で言えば、強力なため制御が難しいとでもいいますか・・・(なんか違うような(笑))

さて、そろそろ解説に入ります。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
#include <stdio.h>

int main(void)
{
   
char str[32]="abcde";//char型で要素数32の配列、strを定義、文字列"abcde"で初期化
   
printf("%s\n",str);//strを文字列として表示
   
return 0;
実行結果:
abcde


まず、5行目ですが、char型の配列を定義し、文字列 "abcde" で初期化しています。
この "" で囲った文字列は、「文字列定数」「リテラル文字列」等と呼び、そのまま、文字列として使うことができます。
当然、文字列定数にも型がありますが、これの型は const char の配列型です。
なお、要素数はこの文字列を保持するのに最低限必要な要素数になっています。

・・・配列なのですが、初期化文に記述した場合は例外的に定義しようとしている配列に文字列をコピーします。
これについては「 変数の宣言と定義 」にも記述があります。

次に、6行目ですが、これは printf 関数を使って5行目でコピーした文字列を表示しています。
変換指定として %s を指定することで、文字列として表示させることができます。
変換指定については「 printf関数の機能(1) 」にも記述があります。

ちなみに、 %s の要求型は const char* ですが、
前項の通り「配列型はその要素のポインタ型に変換される」ので、

   (05/11/17)表記が"abcde"を渡した場合で、ソースと対応していなかった点を修正

この場合も char[32] から char* に変換され、
ちゃんと型が合って処理されます。

・・・ const は?
と思った人もいると思いますが、 const は「変更禁止」という意味なので、
変更可能な変数を渡しても特に問題はありません。
「変更可能」はあくまで「可能」なので、変更禁止にしてもそれは別に問題はないということです。

そのため、コンパイラも const をつけることには一切文句を言いません。
それどころか必要なら勝手につけてくれます。

この例では少々変なカタチで const が付くので上で char* としていますが、普通は const まで一括で変換できます。

   (05/11/17)修正ここまで

上の2つのページの記述中に「ナル終端文字列」という語が出てきます。
C言語の文字列は、文字列の終端を表す「ナル文字」というものがあります。
実は、C言語で扱う文字列は他の関数に渡したりすると渡した変数からは文字数すらわかりません。
そのため、この「ナル文字」を見つけるまでが文字列の中身ということになっています。
つまり、文字列の長さが必要な場合は「ナル文字」を見つけるまでの長さを数えます。

文字列の扱い方は他にもいくつか存在するので、それと区別する際に「ナル終端文字列」という呼び方をすることがあります。
なお、C言語上で「文字列」と言えば基本的には「ナル終端文字列」を指すので通常は単に「文字列」と呼びます。
C++の場合は文字列クラスとかが出現するため、ナル終端文字列を「C文字列」と呼称する場合もあります。
windowsだと文字列の配列を1つの配列に入れ、ナル文字1つで文字列区切り、2つ連続で終了という「ダブルナル終端」とか一風変わったモノもあります(笑)

ちなみに、文字列定数もナル終端文字列です。


さて、文字列は配列を使って扱うわけですから、当然配列を使う時の注意点も含みます。
char 型は1バイト、半角文字も1バイト、ナル文字も1バイト、日本語文字は2バイトです。
したがって、文字列用の char 配列の要素数は半角文字の文字数限界と等しくなります。(ナル文字の分も忘れずに)

入れられる文字数に限界があるというのはかなり面倒なのですが、
そういうものと割り切って考えたほうが気が楽(かもしれない)です(笑)。


今回の加算だけ計算機では、文字列処理は必要ないので今はとりあえずおいておきます。
まず1つ意味のある(?)プログラムを作ることを優先することにします・・・
次回は「キーボードから入力を受ける」の予定です。

[前へ]   [目次へ]   [次へ]

プログラミング講座 総合目次

最終更新 2008/10/17