C++セミナー(初級)文字と文字列処理

HOME->講習会->プログラミングセミナー->C++セミナー(初級)


ユーザーからの入力やファイルからデータを読む混んだりした場合には,データは文字列で与えられます.しかし,C/C++には,文字型(char)はありますが,文字列型はありません(ライブラリはあります).

目次

文字と文字列
文字列データの読み取り
演習

文字と文字列

文字とは,データの入力や出力を行うための1文字のことをいいます.通常はASCIIコードに定義されている文字を使用しますが,現在はワイド文字(日本語など)も使用可能となっています.文字列は,複数の文字を並べたものです.

C/C++では,文字型としてcharがありますが,文字列型はありません.C/C++は,文字型の配列を文字列型として扱います.文字型と文字列型は以下のように定義します.

char c;
char str[100];

文字型と文字列型も他の変数型と同様に宣言と初期化を同時に行うことができます.

char c = 'c';
char str[100] = "Hello world";

C/C++で1文字を代入するときには,「’ ‘」(シングルクォーテーション)で囲む必要があります.文字列の時には,「” “」(ダブルクオーテーション)で囲む必要があります.文字列は,コンピュータに最後の文字を教えないと永遠と文字を表示することになってしまいます.そのため,文字列の語尾にはnull文字と呼ばれるものを付けることになっています.「” “」で囲むと語尾にnull文字が自動挿入されます.ここで,注意しなければならないのが,文字型配列に文字列を入れるときに,配列の要素数を超えた文字列は保存できません.そして,null文字が語尾に入れる必要があるので,今回の例でいえば,99文字の好きな文字列+null文字というようになります.

文字列型については,宣言後の代入処理はできなくなります.

char str[100] = "hello";
str = "world";            // コンパイルエラー

代入以外にも,すべての比較演算子はコンパイルエラーになるか,正しく機能しません.

文字列データの読み取り

文字列については,cstdioとiostreamを用いてデータの読み取りが可能です.cstdioを用いた例を示します.

#include <cstdio>
int main()
{
    char str[100];
    std::scanf("%s", str);
    std::printf("input: %s\n", str);
}

「std::scanfでは,変数の前に&をつけるのでは?」と感じた人もいるかもしれませんが,「C++セミナー(初級)アドレスとポインタ」でも説明したように,変数の前に「&」がある場合はアドレスを参照しています.std::scanfでは,アドレスを渡して,そのアドレスにデータを入れるといった動作をしています.配列では,「[ ]」を省略した場合,0番目の要素のアドレス(先頭アドレスといいます)を参照することになります.

次は,iostreamを用いた例を示します.

#include <iostream>
int main()
{
    char str[100];
    std::cin >> str >> std::endl;
    std::cout << "Input: " << str << std::endl;
}

iostreamについては,他の変数型と同じようにして入力を得ることができます.しかし,半角区切りやカンマ区切りでの入力などはできないので注意が必要です.

演習

・入力された2つの文字列のデータ\(s,t\)において,文字列\(s\)に\(t\)が含まれるか判定するプログラムを作成してください.なお,含まれる場合には,何文字目から含まれるのかを表示し,複数ある場合には,文字列の左側に近いものを表示してください.