文字列
文字列
C では,文字列は文字の配列として表現されます。
そのため,文字列変数は原則として char str[長さ] のように用意します。
次のプログラムは,名前の入力を受け付け,「こんにちは,<名前>さん」と出力するプログラムです。
1 行分の文字列入力を受け付ける gets 関数を使っています。
#include <stdio.h>
int main(void)
{
char name[20]; /* 長さ 20 の文字列変数 */
printf("名前を入力: ");
gets(name); /* 名前の入力を受付 */
printf("こんにちは,%sさん\n", name);
return 0;
}
名前を入力: taro
こんにちは,taroさん
ちなみに,長さ 20 以上の文字列を入力すると,このプログラムは不正な動作をします。
これは重大な脆弱性となるが,gets 関数はこの問題を回避することができません。
そのため,最近の仕様では gets 関数は廃止され,代わりに fgets 関数の使用が推奨されています。
ヌル文字
C では,文字列の終端は文字 '\0' (ヌル文字) で表現されます。
そのため,文字列変数は文字列の長さより 1 以上大きいサイズである必要があります。
次のプログラムは,文字列の長さを調べる strlen 関数を定義した例です。
文字列の終端がヌル文字であることを利用しています。
#include <stdio.h>
/* 文字列 str の長さを返す */
int strlen(char *str)
{
int len = 0;
while (str[len] != '\0') len++;
return len;
}
int main(void)
{
char *str = "hello";
printf("%d\n", strlen(str)); /* 出力: 5 */
return 0;
}
文字列の初期化と代入
ポインタで char *str1 という変数を宣言したとき,str1 自体は容量がないので文字列を格納しませんが,別の場所の文字列を指すことができます。
例えば str1 = str2 あるいは str1 = "hello" と書けば,str1 は文字列 str2 や "hello" を自由に指すことができます。
一方,char str3[20] と宣言された変数 str3 は,その配列専用のポインタなので,別の文字列を指すことはできません。
そのため str3 = str4 あるいは str3 = "hello" のような代入は無効です。
ただし,宣言時にだけ char str3[20] = "hello" または char str3[] = "hello" のような書き方での初期化は可能です。
#include <stdio.h>
int main(void)
{
char str1[20] = "abc"; /* str1 の型は char [20] */
char str2[] = "def"; /* str2 の型は char [4] */
char *str3 = "ghi"; /* str3 の型は char * */
str1 = "jkl"; /* 不可 (strcpy を使うべし) */
str2 = "mno"; /* 不可 (strcpy を使うべし) */
str3 = "pqr"; /* 可 */
return 0;
}
文字列操作
文字列操作用の標準関数として,次のようなものが利用できます。
これらを利用する際は,ソースコードの冒頭に #inlude <string.h> を追加します。
関数 | 説明 |
---|---|
strlen(s) | 文字列 s の長さを返します。 |
strcpy(s, t) | 文字列 s に文字列 t をコピーします。 |
strcat(s, t) | 文字列 s の後ろに文字列 t を連結します。 |
strcmp(s, t) | 文字列 s が文字列 t より大きければ正の値を,終り小さければ負の値を,等しければ 0 を返します。 |
コマンドライン引数
コマンドライン引数を受け取るには,main 関数の引数リストを次のプログラムのように書きます。
#include <stdio.h>
/* argc: コマンドライン引数の数
* argv: コマンドライン引数の配列 */
int main(int argc, char *argv[])
{
int i;
int (i = 0; i < argc; i++)
printf("%s\n", argv[i]);
return 0;
}
<b>[実行例]</b>
% ./a.out hello, world "hello, world"
./a.out
hello,
world
hello, world
argv は文字列 (char *) の配列となっていて,コマンドライン引数が入る。argc は argv の要素数です。