C++サンプル集

【第1部】C言語(K&R検証)編

0023.行から文字列を検索する

ソース紹介

CPPファイルに記述
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;

/*
sにおけるtのインデックスを返す。見つからなければ-1
*/
int strindex(const char s[],const char t[]) {
    int i, j, k;
    for (i = 0; s[i] != '\0'; i++) {
        for (j = i, k = 0; t[k] != '\0' && s[j] == t[k]; j++, k++) 
            ;
        if (k > 0 && t[k] == '\0') {
            return i;
        }
    }
    return -1;
}

/*
strindexのテスト
*/
int main()
{
    string str;
    string pattern = "abc";
    while (getline(cin, str)) {
        if (strindex(str.c_str(), pattern.c_str()) >= 0) {
            cout << str << endl;
        }
    }
    return 0;
}
出力
 このサンプルでは、テキストファイルを用意し、そのファイルを標準入力リダイレクトする形で検証したいと思います。まず、コンソールを開き、実行ファイルのあるディレクトリに移動します。その上でabc.txtというファイルを作成して、中に以下を記述します。
abc.txt
Hello World
YYYXXXabcKKK
ABCDEFG
XYZabcABC
AabcBCBC
 記述が終わったら、例えば、プログラム名がmain.exeだったとして、以下のコマンドを打ち込みます
> main.exe < abc.txt
 このコマンドはmain.exeに対してabc.txtリダイレクトしなさいというコマンドです。
 リダイレクトというのは、そのファイルを標準入力にするということです。すると
YYYXXXabcKKK
XYZabcABC
AabcBCBC
 という出力が得られます。abcが入っている行だけが抽出されます。

サンプル説明

 strindex()関数は、与えられた文字列と、検索する文字列を比較して、最初に、与えられた文字列中に検索する文字列の先頭が出てきたら、そこから、合致してるかどうかを検証します。
  i j k 3つの変数をうまく使っているのがわかります。
 C++で記述する場合、stringを使えばstrindex()関数は必要なくなります。

ソース紹介

CPPファイルに記述
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;

/*
findのテスト
*/
int main()
{
    string str;
    string pattern = "abc";
    while (getline(cin, str)) {
        if (str.find(pattern) != string::npos) {
            cout << str << endl;
        }
    }
    return 0;
}

サンプル説明

 stringにはfind()関数があり、これを使うと文字列中の文字列を検索できます。

K&Rでの記述

 元になったのは第4章:関数とプログラム構造に記述されています。関数についての基本事項の説明のところです。