私はなります
- チェック文字列が文
- にある場合は、開始(
line
と同じポインタ)で見つかった場合は、単語の長さを追加し、英数字文字が見つかったかどうかを確認します。そうでない場合(またはヌルで終了)は、その後、他のどこにも見つかった場合
- にマッチテスト「の前に何alphanum」余分を追加していない
コード:ここ
#include <stdio.h>
#include <strings.h>
#include <ctype.h>
int main()
{
const char* line = "hellodarkness my old friend";
const char *word_to_find = "hello";
char* p = strstr(line,word_to_find);
if ((p==line) || (p!=NULL && !isalnum((unsigned char)p[-1])))
{
p += strlen(word_to_find);
if (!isalnum((unsigned char)*p))
{
printf("Match\n");
}
}
return 0;
}
それは何も印刷されません。前/後に句読点/スペースを挿入するか、"hello"
の後に文字列を終了すると、一致します。また、の前にアルファベットの文字を挿入することで一致することはありません。こんにちは。
EDIT:"hello"
が1つのみの場合は上記のコードはいいですが、"hello"
を"hellohello hello"
に見つけることができません。だから我々はこのように、毎回p
進め、単語やNULL
を探すためにループを挿入する必要があります。
#include <stdio.h>
#include <strings.h>
#include <ctype.h>
int main()
{
const char* line = " hellohello hello darkness my old friend";
const char *word_to_find = "hello";
const char* p = line;
for(;;)
{
p = strstr(p,word_to_find);
if (p == NULL) break;
if ((p==line) || !isalnum((unsigned char)p[-1]))
{
p += strlen(word_to_find);
if (!isalnum((unsigned char)*p))
{
printf("Match\n");
break; // found, quit
}
}
// substring was found, but no word match, move by 1 char and retry
p+=1;
}
return 0;
}
'はstrstr()は' ...ちょうど真または偽の試合へのポインタ、いないを返し、ちょうどチェックその前と後の文字はアルファベットではない(または好きな場合はアルファベット文字ではない) - そうでない場合、有効なマッチを得ています。そうであれば、返されたポインタの直後からやり直してください。 – Dmitri
['strstr()'](https://linux.die.net/man/3/strstr)のドキュメントはその動作を説明しています。それは、ある文字列の出現を別の文字列の部分文字列として探すことです。そのような部分文字列が見つかった場合、 'strstr()'自体は部分文字列の外観を囲む文字*に関する情報を持ちませんが、あなた自身の周りを見ることができます。 –