C言語の文字列リテラルとは?基本の仕組みと注意点をわかりやすく解説
文字列リテラルとは
C言語における文字列リテラルとは、ヌル文字('\0')で終端された文字(char)の連続した並びのことです。ダブルクォートで囲まれた文字列がソースコード中に現れると、それは文字列リテラルとして扱われます。
char *str = "hi, hello"; /* 文字列リテラル */
配列の初期化に使用する
文字列リテラルは、char型配列の初期化によく使われます。
char a1[] = "xyz"; /* a1はchar[4]型で {'x','y','z','\0'} を保持 */
char a2[4] = "xyz"; /* a1と同じ内容になる */
char a3[3] = "xyz"; /* {'x','y','z'} のみが格納され、'\0' が欠落する */
注意点として、配列サイズが文字数とちょうど同じ場合、終端のヌル文字が格納されません。この場合、その配列は正しい「文字列」として扱えなくなる可能性があるため、必ずヌル文字の分も含めたサイズを確保しましょう。
文字列リテラルは書き換えできない
文字列リテラルは変更不可能(読み取り専用)です。値を書き換えようとすると、未定義動作を引き起こします。プログラムがクラッシュしたり、予期しない結果になったりする恐れがあります。
char* s = "welcome"; s[0] = 'W'; /* 未定義動作 */
constを使って安全に宣言する
文字列リテラルを指すポインタは、必ずconst付きで宣言するのが安全です。誤って書き換えようとした場合、コンパイラがエラーとして検出してくれるため、バグを未然に防げます。
char const* s1 = "welcome"; s1[0] = 'W'; /* コンパイルエラー! */
さまざまな文字セットに対応
文字列リテラルは「文字定数」とも呼ばれます。C11以降では、エンコーディングを指定する接頭辞によって、複数の文字セットをサポートしています。
/* 通常の文字列リテラル(char[] 型) */ char* s1 = "abc"; /* UTF-8文字列リテラル(char[] 型) */ char* s3 = u8"abc"; /* 16ビットワイド文字列リテラル(char16_t[] 型) */ char16_t* s4 = u"abc"; /* 32ビットワイド文字列リテラル(char32_t[] 型) */ char32_t* s5 = U"abc";
u8・u・Uといった接頭辞を使い分けることで、UTF-8、UTF-16、UTF-32など、目的に応じたエンコーディングの文字列を表現できます。国際化対応のプログラムを書く際には、これらの接頭辞の使い分けが重要になります。
-
C言語のstrcmp()関数とは?文字列比較の基本と使い方を徹底解説
C言語の標準ライブラリ関数 int strcmp(const char *str1, const char *str2) は、ポインタ str1 が指し示す文字列と、str2 が指し示す文字列を比較するための関数です。C言語において、文字型の配列は「文字列」と呼ばれます。まずは文字列の基本的な扱い方から確認していきましょう。文字列の宣言文字列(文字配列)の宣言は以下のように行います。char stringname [size];例えば、char string[50]; と宣言すれば、最大50文字の長さを持つ文字列を格納できます。文字列の初期化文字列の初期化には、主に次の2つの方法があります。1
-
C言語のstrcpy()関数とは?基本構文と使い方をわかりやすく解説
C言語のライブラリ関数 char *strcpy(char *dest, const char *src) は、src が指し示す文字列を dest にコピーするための関数です。 C言語では、文字の配列のことを「文字列」と呼びます。 文字列の宣言 文字列(文字配列)の宣言は、以下の形式で行います。 char stringname[size]; 例えば char string[50]; と宣言すると、最大50文字の文字列を格納できる配列が確保されます。 文字列の初期化 文字列の初期化には、主に以下の2つの方法があります。 1. 文字定数を使う方法 char string[10] = {H,