文字列

スポンサーリンク

文字列

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" のような書き方での初期化は可能です。

3つの文字列変数の違い

#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 の要素数です。

スポンサーリンク