質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

6回答

1938閲覧

C言語 「単語」捜索

Tosshi

総合スコア21

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/10/31 04:45

編集2018/10/31 04:54

C言語で長文の中から『単語』捜索をするプログラムを作成したいです。
文字列ではなく単語です。例えば「print」という単語を捜索したい時に「printf」は引っかからない様にしたいです。
ただし「print,」 「print!」などは捜索の対象にしたいです。
直前、直後にアルファベットが来なければ対象になります。

適切な関数がある場合にはそれでも構いません。
回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2018/10/31 04:50

もう少し厳密に定義して下さい。たとえば、「print1」「print-foo」「print_bar」のようなものは対象なのでしょうか、違いますでしょうか。
Tosshi

2018/10/31 04:54

直前、直後にアルファベットが来なければ対象になります。なので、三つは対象になります。編集します。
退会済みユーザー

退会済みユーザー

2018/10/31 05:21 編集

自分で考えて組まないと何の意味もなく、それならプログラミングせず遊んだりゲームしたり他の事してたほうがいいのでは…。質問文が言葉足らずなだけかもしれませんが。。
guest

回答6

0

残念ながら、そういう標準関数はありません。
なので、がんばってそういうコードを組む必要がありますね

投稿2018/10/31 04:50

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

yumetodoさんの回答に同意です。
引っ掛けたあと、前後の文字がどうなのかを判定すれば比較的簡単ではないかと思います。
以下サンプルです。

c

1#include <stdio.h> 2#include <string.h> 3#include <ctype.h> 4int main(void){ 5 char text[] = "teratail print text"; 6 char word[] = "print"; 7 char *p; 8 p = strstr(text, word); 9 if(p != 0x00 && 10 isalpha(*(p-1)) == 0 && isalpha(*(p+strlen(word))) == 0){ 11 printf("%d文字目\n", p - text); 12 } else { 13 printf("見つからない\n"); 14 } 15 return 0; 16}

但しいくつかの処理が足りてません。
見つかったのが1文字目の場合、単純にp-1で見てはいけない。
例えばtext[]="teratail printf print text";とあった場合、strstrではprintfに引っかかるので再度検索する必要がある。
そこらへんは自力で実装してください。

投稿2018/10/31 06:07

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tosshi

2018/10/31 06:10

出来ました。ありがとうございます
guest

0

strstrで単純に一致検索を掛けつつ、条件に合うかを愚直に判定するしかないかと

投稿2018/10/31 05:00

yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

  1. 英単語リストを探して落とします。
  2. 対象の文を任意の区切り文字で分割します。
  3. 分割した各文字列が英単語リスト内にあれば検索対象の文字列です。

このとき、記号などは取り除いた文字列を使用する必要があります。

投稿2018/10/31 04:57

dice142

総合スコア5158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

REGEX

C 言語でいつの間にか正規表現が使えるようになっていたんですね。

投稿2018/10/31 06:14

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「単語」ということから、ふたつの方法が考えられそうです。

A. 単語に分けてから、目的の単語を探す

  1. テキストを単語に分ける、つまり、アルファベット以外の文字で分割する。
  2. 分けてできた単語の中に、目的の単語があるかどうか探す。

B. 目的の単語に一致するものを見つけてから、単語になっているか確かめる

  1. テキストの最初に移動する。
  1. テキストの現在位置以降に、目的の単語に一致する部分があるか探す。
    なければ、探索は失敗→終了
  2. 一致した部分が単語になっているかを確かめる、つまり、一致した部分のすぐ前やすぐ後にアルファベットがないことを確認する。
    確かめられれば、探索は成功→終了
  3. 一致した場所の次の場所に移動し、1. から繰り返し。

このうちA.は、探す仕組みは分かりやすいですが、目的の単語がまったくないときでも全部の単語を取り出さなければならないため、効率が悪そうです。

個人的にはB.がいいです。1. の「目的の単語に一致する部分があるか探す」はstrstr関数でできそうです。あとは考えてみて下さい。


余談。実は「一致する部分があるか探す」方法として、strstr関数よりも高速に探せるアルゴリズムがいくつか知られているのですが、ここでは説明しません。興味があれば調べてみられるといいと思います。さしあたりはstrstr関数を使っておけばいいです。

投稿2018/10/31 06:12

編集2018/10/31 06:14
ikedas

総合スコア4335

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問