ベイジアン研究所

技術(人工知能、数学等)と心理の話をしています。

【C言語入門】文字列編

1. 文字列とは
printf関数で、文字を画面に表示する時、次のように書いた。

printf("あいうえお");

"あいうえお"のように、文字の並びを二重引用符で囲んだものを「文字列リテラル」と言う。

文字列リテラルは、「ナル文字」(値が0の文字)と呼ばれる文字が末尾に付加された状態で記憶域に格納される。ナル文字は「¥0」と表記される。

例えば5文字で構成される文字列リテラル"あいうえお"は6文字分の記憶域を占有する。 f:id:camelsan:20201005192301p:plain

文字列リテラルの性質には次のようなものがある。

  • 文字列リテラルには静的記憶期間が与えられる
    文字列リテラルは、プログラムの最初から最後まで生存する。

  • 同一文字列リテラルの扱いは、処理型依存
    次の2通りが考えられる。
    1.同一の文字列リテラルは同一のものとして扱う。(記憶域の格納レベルで同じ場所に格納する。)
    2.同一の文字列リテラルでも、別物として格納する。 f:id:camelsan:20201005193925p:plain

2. 文字型
文字を格納する型のことを、「文字型」といい、charで宣言をする。ここで言う文字とは「A」や「B」などの一つの文字のことである。

文字”列”を扱うには、文字型の配列を使えば良い。例えば、

alp = "ABC";

において、

alp[0] = "A";
alp[1] = "B";
alp[2] = "C";
alp[3] = ¥0;

である。文字列の末尾はナル文字が格納されており、逆に文字列の末尾は、最初に出現するナル文字である。これは、例えば次の例を考えれば良い。

printf("ABC¥0DE");

の出力としては、

ABC

である。すなわち、"ABC¥0DE"は、"ABC"と認識される。

文字配列を初期化するには次のいずれかで行う。

char str[] = {"A", "B", "C", "¥0"};

もしくは、

char str[] = "ABC"

文字列の初期化子の代入は不可能である。末尾にナル文字がつくので、要素数を指定する場合は多めに指定する必要がある。

文字が一つもない文字列のことを「空文字列」といい、記憶域上には、ナル文字だけが格納される。

文字列のscanf関数による読み込みは次のように行う。

scanf("%s", name)

読み込む際にも、末尾にナル文字が格納される。 f:id:camelsan:20201005200553p:plain

文字列の変化指定子の詳細 f:id:camelsan:20201005200942p:plain

  • 最小フィールド幅
    少なくとも、この桁だけの表示が行われる。
    省略された場合はや指定数よりも文字数が多い場合は、表示するのに必要な桁数で表示される。
    -が指定された場合は左側に寄せられ、指定がない時は右側に寄せられる。

  • 精度
    表示する桁数の上限を表示する。ここに指定された以上の文字数は出力されない。

  • 変換指定子
    sは文字列を表示することを指定する。配列内の文字はナル文字の直前まで出力される。精度が省略された場合や配列の大きさよりも大きい場合は、配列は必ずナル文字を含む。 f:id:camelsan:20201005201837p:plain