2014-11-29 2 views
1

У меня есть программирование, которое я не могу закончить. Эта одна часть меня убивает.Поиск слов в предложениях

Принять текст от пользователя. Примите строку, которую нужно искать. Предполагается, что ваша программа напечатает количество вхождений строки, найденной в тексте, и позицию, в которой был найден шаблон. Посмотрите на следующий образец:

Образец выходного сигнала: Введите текст: «Позвоните мне, Измаил. Несколько лет назад - неважно, сколько именно времени - с небольшими деньгами или без денег в моем кошельке, и ничего особенного, чтобы заинтересовать меня на берегу, я думал, что немного поплыву и увижу водянистую часть мира. Это путь, который я отъезжающих селезенку, и регулируя циркуляцию»

Строка поиска -„Несколько лет назад“

Количество вхождений - 1

Позиция Найдено - 18

Это моя функция:

void getText() 
{ 
    string itext, word; 
    int position; 
    bool done = false; 
    cout << "Enter some text" << endl; 
    cin >> itext; 
    cout << "Enter the word or phrase to wish to find" << endl; 
    cin >> word; 
    char text[itext.length()]; 
    char search[word.length()]; 

    for(int i = 0; i < itext.length(); i++) 
    { 
     for(int j = 0; j < word.length(); j++) 
     { 
      if(text[i] == search[j]) 
      { 
       position = i; 
       cout << position; 
      } 
     } 
    } 
} 
+0

Это кит проблемы. Вы хотите найти символ НЕ, соответствующий и перейти к следующей позиции. – stark

+0

текст и поиск в нем ничего не имеют. Кроме того, вам нужно проверить, соответствует ли itext [i] слово [0], а затем продолжить сопоставление else, просто увеличивая i; –

+1

Когда вы находитесь внутри внутреннего цикла word.length, вы сравниваете каждый символ строки слова с тем же символом строки фразы. Вы сообщаете об успехе, если какой-либо один символ в слове соответствует текущему символу фразы. –

ответ

0

Вы можете сделать вашу жизнь намного проще, если вы будете использовать std :: string в этой задаче вместо char []. Все, что вам нужно сделать, это загрузить текст в строку std ::, а затем использовать метод find, как описано здесь: http://www.cplusplus.com/reference/string/string/find/

Кстати, я не уверен, что эти строки могут работать так, как вы можете создать динамический массив только с постоянной длиной выражения

char text[itext.length()]; 
char search[word.length()]; 
2

Это может вам начать работу: (псевдо код из алгоритма Кнута-Морриса-Пратта)

algorithm kmp_search: 
    input: 
     an array of characters, S (the text to be searched) 
     an array of characters, W (the word sought) 
    output: 
     an integer (the zero-based position in S at which W is found) 

    define variables: 
     an integer, m ← 0 (the beginning of the current match in S) 
     an integer, i ← 0 (the position of the current character in W) 
     an array of integers, T (the table, computed elsewhere) 

    while m + i < length(S) do 
     if W[i] = S[m + i] then 
      if i = length(W) - 1 then 
       return m 
      let i ← i + 1 
     else 
      if T[i] > -1 then 
       let m ← m + i - T[i], i ← T[i] 
      else 
       let i ← 0, m ← m + 1 

    (if we reach here, we have searched all of S unsuccessfully) 
    return the length of S 

http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm

EDIT: Simpler и с помощью C++ станд библиотека:

#include <string> 
#include <vector> 

int main() 
{ 

    std::string str ("There are two needles in this haystack with needles."); 
    std::string str2 ("needle"); 

    // different member versions of find in the same order as above: 
    std::size_t found = 0; 
    int matches = 0; 
    std::vector<size_t> positions; 

    while(found = str.find(str2) != std::string::npos) { 
     matches++; 
     positions.push_back(found); 
    } 
} 
Смежные вопросы