「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;
}
文字列の照合アルゴリズム
Re: 文字列の照合アルゴリズム
厳密にはtestは文字列ではなく、char配列です。
0で終端されたchar配列を文字列として扱うstr関数群があるだけです。
で、p=配列変数名というコードは、pに配列変数の先頭アドレス(ポインタ)を代入するコードになります。
配列変数名に整数(n)を加えると配列変数のn番目の要素へのポインタになります。
0で終端されたchar配列を文字列として扱うstr関数群があるだけです。
で、p=配列変数名というコードは、pに配列変数の先頭アドレス(ポインタ)を代入するコードになります。
配列変数名に整数(n)を加えると配列変数のn番目の要素へのポインタになります。
オフトピック
ソースコードを記述する場合、codeタグで囲っていただけると幸いです。
Re: 文字列の照合アルゴリズム
for文でアドレスを比較するのは初めての経験だったのでわかりやすい説明ありがとうございました!
pにはtext文字列配列の先頭アドレスが代入されていることに気づきませんでした
すっきりしました。ありがとうございました.
pにはtext文字列配列の先頭アドレスが代入されていることに気づきませんでした
すっきりしました。ありがとうございました.
Re: 文字列の照合アルゴリズム
質問の趣旨とは関係ありませんが、
<string.h> には search と同じ働きをする strstr が
用意されているので次のように書けます。
もとのプログラムが whileループの中で strlen(key) が何度も
繰り返し実行されるのが気になったので、書き直してみました。
<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);
}
繰り返し実行されるのが気になったので、書き直してみました。
Re: 文字列の照合アルゴリズム
かずまさんありがとうございます。
strstr関数というものがあるんですね…
書き直していただいたコードみたいにすっきり書けるように頑張ります!
strstr関数というものがあるんですね…
書き直していただいたコードみたいにすっきり書けるように頑張ります!