文字列リテラル
文字列リテラルとは、”ABC”のように、文字の並びを二重引用符”で囲んだものである。
文字列リテラルの末尾には、見た目ではわからない、ナル文字(NULL)という値0の文字がついている。(8進拡張表記で’\0’である)
つまり、”と”の間に置かれた文字の並びの後ろに、ナル文字がついた状態で記憶域に格納される。
![](https://i0.wp.com/my-studies.org/wp-content/uploads/2022/11/string06.png?resize=400%2C320&ssl=1)
a・・・見かけ上3文字の文字列リテラル"ABC"は、4文字分の記憶域を占有する。
b・・・見かけ上0文字のリテラル""は、ナル文字のための1文字分の記憶域を占有する。
文字列リテラルの大きさ
文字列リテラルの末尾にナル文字が付加されることを下記のプログラムで確認しよう。
#include <stdio.h>
int main(void)
{
printf("sizeof(\"ABC\") = %zu\n",sizeof("ABC"));
return 0;
}
実行結果
sizeof("ABC") = 4
3つの文字列リテラルの大きさを、sizeof演算子で取得して表示している。この場合は、4文字分の記憶域を占有する。
文字列
文字の並びを表す「文字列」の格納先として最適なのが「char型の配列」である。文字列の末尾は、最初に出現するナル文字(NULL)である。
下図のように、文字列”ABC”であれば、’A’と’B’と’C’と’\0’の4個の文字をchar型の配列に先頭要素から順に格納する。
![](https://i0.wp.com/my-studies.org/wp-content/uploads/2022/11/string04.png?resize=640%2C400&ssl=1)
文字列”ABC”をchar型の配列に格納して表示してみよう。下のプログラムで確認できる。
#include <stdio.h>
int main(void)
{
char str[4] = {'A','B','C','\0'};
printf("文字列strは\"%s\"です。¥n",str);
return 0;
}
実行結果
文字列strは"ABC"です。
なお、文字列の初期化に限り、次のように宣言できる。
char str[] = "ABC";
したがって、先のプログラムは下のように書くことができる。
#include <stdio.h>
int main(void)
{
char str[] = "ABC";
printf("文字列strは\"%s\"です。¥n",str);
return 0;
}
実行結果
文字列strは"ABC"です。
文字列の読み込み
次に、文字列をキーボードから読み込んで表示するプログラムである。実行して確認してみよう。
#include <stdio.h>
int main(void)
{
char name[48];
printf("お名前は:");
scanf("%s",name);
printf("こんにちは、%sさん。¥n",name);
return 0;
}
実行結果
お名前は:champ
こんにちは、champさん。
何文字の名前になるかは事前に不明なので、配列の要素数は多めに48としている。文字列の読み込みの際にscanf関数に与える変換指定は%sである。なお、読み込んだ文字列の格納先として与える実引数nameは配列なので、&演算子を置くことはできない。
(参考文献)「C言語 新版 ゼロからはじめるプログラミング」 三谷 純 (著) 翔泳社、
「新・明解C言語 入門編 第2版 」柴田 望洋 (著) SBクリエイティブ
コメント