C++ 基礎
首都大学東京 田川研究室
戻る

文字列

はじめに言っておきますが、Cに文字列を操作する機能はありません。文字列なんてのはただの数値ですので誤解無く。
では、以下のコードを見ていきます。
#include <stdio.h>

int main()
{
    char *pstr;

    pstr = new char[20];
    pstr[0] = 'a';
    pstr[1] = 'b';
    pstr[2] = 'c';
    pstr[3] = '/';
    pstr[4] = '0';
    pstr[5] = '1';
    pstr[6] = '2';
    pstr[7] = '3';
    pstr[8] = ' ';
    pstr[9] = '%';
    pstr[10] = 'd';
    pstr[11] = '\n';
    pstr[12] = 0;
    int c;
    
    c = 0;
    while(c < 13)
    {
        printf("%d\n" , pstr[c]);
        c = c+1;
    }
    
    printf(pstr , 99);
    printf("\n");
    return 0;
}
実行すれば以下のように表示されると思います。
char型変数というのは1バイト整数値型ともいえます。intが4バイト整数値です。1バイト整数ですので256とおり、そのうち1つが正負の符号に使われますから-128から127までの数値を表すことができます。
コンピュータでは文字を数値で表現します。↑の実行結果を見る限り、97番が'a' 、 47番が'0'のように割り振られているようです。'0'はコンパイル時に47という数値へ変換されます。ということは以下のコードは先ほどとまったく同じ動作をするはずです。
#include <stdio.h>

int main()
{
    char *pstr;

    pstr = new char[20];
    pstr[0] = 97;
    pstr[1] = 98;
    pstr[2] = 99;
    pstr[3] = 47;
    pstr[4] = 48;
    pstr[5] = 49;
    pstr[6] = 50;
    pstr[7] = 51;
    pstr[8] = 32;
    pstr[9] = 37;
    pstr[10] = 100;
    pstr[11] = 10;
    pstr[12] = 0;
    int c;
    
    c = 0;
    while(c < 13)
    {
        printf("%d\n" , pstr[c]);
        c = c+1;
    }
    printf(pstr , 99);
    printf("\n");
    return 0;
}


ところで最後の行、printf()で文字列として表示できていますね。つまりこの関数は文字列を受け取るのではなく、文字を格納した配列の先頭アドレスを受け取ることになります。
Cの文字列をあらわす規格として、最後の数値を0にするという決まりがあります。なので配列の最後に0を代入しているのです。printfに配列のサイズ、つまり文字列の長さを指定しなくてもちゃんと表示できるのはこういった規格があるからです。逆に配列の最後に0を入れておかないとそのまま配列をぶち抜いて永遠と読み取っていきます。こわぁ。バグの原因ですね。

C言語を操作していて文字列関連のバグは非常に多いです。特に最後の0を入れていないことによる配列のぶち抜きが後を絶ちません。C++では改善されます。

ところで以下のコード
#include <stdio.h>

int main()
{
    printf("hello !!!!\n");
    return 0;
}
動きますよね。文字列は配列に数値を並べたものだと言いました。しかし上記コードに配列は見当たりません。
これはコンパイル時に以下のコードへ置き換わると思ってもらい、差し支えありません。
#include <stdio.h>

int main()
{
    char pstr[12];
    
    pstr[0] = 'h';
    pstr[1] = 'e';
    pstr[2] = 'l';
    pstr[3] = 'l';
    pstr[4] = 'o';
    pstr[5] = ' ';
    pstr[6] = '!';
    pstr[7] = '!';
    pstr[8] = '!';
    pstr[9] = '!';
    pstr[10] = '\n';
    pstr[11] = 0;
    printf(pstr);
    return 0;
}
つまり、プログラム上のどこかに文字列"aaaa"などのように書くと、コンパイル時にその文字列を格納する配列を用意し、その配列の先頭アドレスで文字列を書いた場所を置き換えるという処理になります。
よって以下の発想が生まれます。
#include <stdio.h>

int main()
{
    char *pstr;
    
    pstr = "hello !!!!!!!!";
    printf(pstr);
    return 0;
}
文字列はポインタで受け取れるということです。以上文字列の基礎でした。加筆に期待。