【第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を
リダイレクトしなさいというコマンドです。
リダイレクトというのは、
そのファイルを標準入力にするということです。すると
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章:関数とプログラム構造に記述されています。
関数についての基本事項の説明のところです。