文字列の照合アルゴリズム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
girafeeee
記事: 3
登録日時: 2ヶ月前

文字列の照合アルゴリズム

#1

投稿記事 by girafeeee » 2ヶ月前

「C言語によるはじめてのアルゴリズム入門」という本の3-6にある「文字列の照合」
でのソースコードで理解できないところがあります。
下記のコードで
for (p = text; p <= text + m - n; p++)
という部分があるのですがtextは文字列なのにfor分のなかにあり、整数であるm-nを加えていて、
このコードがどういう動きをしているのか分かりません。
p=text(文字列)とはどういう意味なのでしょうか
初歩的な質問で申し訳ないのですがお願いしますm(__)m

#include "stdafx.h"
#include <string.h>

char *search(char *, char *);

void main(void)
{
static char text[] = "This is a pen.That is a pensil.";
char *p, *key = "pen";

p = search(text, key);
while (p != NULL) {
printf("%s\n", p);
p = search(p + strlen(key), key);
}
}

char *search(char *text, char *key)
{
int m, n;
char *p;

m = strlen(text);
n = strlen(key);
for (p = text; p <= text + m - n; p++) {
if (strncmp(p, key, n) == 0)
return p;

}
return NULL;
}

maru
記事: 149
登録日時: 7年前

Re: 文字列の照合アルゴリズム

#2

投稿記事 by maru » 2ヶ月前

厳密にはtestは文字列ではなく、char配列です。
0で終端されたchar配列を文字列として扱うstr関数群があるだけです。

で、p=配列変数名というコードは、pに配列変数の先頭アドレス(ポインタ)を代入するコードになります。
配列変数名に整数(n)を加えると配列変数のn番目の要素へのポインタになります。
オフトピック
ソースコードを記述する場合、codeタグで囲っていただけると幸いです。

girafeeee
記事: 3
登録日時: 2ヶ月前

Re: 文字列の照合アルゴリズム

#3

投稿記事 by girafeeee » 2ヶ月前

for文でアドレスを比較するのは初めての経験だったのでわかりやすい説明ありがとうございました!
pにはtext文字列配列の先頭アドレスが代入されていることに気づきませんでした
すっきりしました。ありがとうございました.

かずま

Re: 文字列の照合アルゴリズム

#4

投稿記事 by かずま » 2ヶ月前

質問の趣旨とは関係ありませんが、
<string.h> には search と同じ働きをする strstr が
用意されているので次のように書けます。

コード:

#include <stdio.h>
#include <string.h>  // strlen, strstr

int main(void)
{
	static char text[] = "This is a pen.That is a pensil.";
	char *key = "pen";
	int len = strlen(key);
	for (char *p = text; p = strstr(p, key); p += len) puts(p);
}
もとのプログラムが whileループの中で strlen(key) が何度も
繰り返し実行されるのが気になったので、書き直してみました。

girafeeee
記事: 3
登録日時: 2ヶ月前

Re: 文字列の照合アルゴリズム

#5

投稿記事 by girafeeee » 2ヶ月前

かずまさんありがとうございます。
strstr関数というものがあるんですね…
書き直していただいたコードみたいにすっきり書けるように頑張ります!

返信

“C言語何でも質問掲示板” へ戻る