Разбор строки для слова

0

Я хочу создать программу, которая анализирует строку и что-то делает, если найдено слово внутри строки. Вот что я получил:

size_t strPos;
string str = "";

switch(str.find(str, strPos)
{
   case 'APPLE':
   cout << "You are eating an apple!" << endl;
   break;

   case 'ORANGE':
   cout << "You are eating an orange!" << endl;
   break;

   default:
   cout << "You're eating something... that for sure!" << endl;
   break;

   // etc...
};

Проблема в том, что этот код работает, но не работает. Как я могу разбирать строку и искать слово, как в приведенном выше? Я полагаю, что использование оператора switch неверно.

  • 2
    Последующее если плюс «APPLE» не является строкой.
  • 2
    Вы не можете использовать switch() со строками, только с целыми числами.
Показать ещё 1 комментарий
Теги:

5 ответов

0
Лучший ответ

Вам нужно будет использовать таблицу поиска, std::map или if-else if-else.

Каждая структура данных зависит от того, что вы хотите связать со своими строками:

  • Таблица поиска - функции или данные. Если функции, они должны иметь одну и ту же подпись.
  • std :: map - функции или данные. Если функции, они должны иметь одну и ту же подпись.
  • Лестница If-else - Очень гибкая.

Справочная таблица

Это предполагает создание структуры записи или записи и поиск "ключевого" значения. Как только "ключ" найден, у вас есть доступ к указателю функции или данным, связанным с ключом.

struct  Lookup_Entry
{
  std::string item;    // The "key"
  std::string phrase;  // The "value"
};
Lookup_Entry lookup_table[] =
{
  { "APPLE", "You ate an apple!\n"},
  { "ORANGE", "You ate an orange!\n"},
  { "ROCK", "You should not eat rocks.\n"},
};

Использование std::map

std::map< std::string, std::string> lookup_table;
lookup_table["APPLE"] = "You are eating an apple.\n";
lookup_table["ORANGE"] = "You are eating an orange.\n";
lookup_table["ROCK"] = "You broke some teeth eating the rock.\n";

if-else if-else-лестница

if (text == "APPLE"}
{
  cout << "You ate an apple.\n";
}
else if (text == "ORANGE")
{
  cout << "You ate a yummy orange.\n";
}
else
{
  cout << "You ate something unknown, hope you don't get sick.\n";
}
2

Есть несколько вопросов.

  1. В C++ вы не можете использовать строки включения.

  2. Начальная позиция вашего поиска (strPos) неинициализирована в вашем коде

  3. Даже если это 0,

    str.find(str, strPos)
    

    возвращает начальную позицию самой строки (= 0), см. строку :: find

  4. "APPLE" не является строкой, "APPLE" будет.

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

    if (str == "APPLE")
    {...}
    else if (str == "ORANGE")
    {...}
    else
    {...}

Редактировать:

  1. Как писал Кен Уайт в комментарии, str всегда инициализируется пустой строкой.
1

Помимо некоторых синтаксических ошибок, ваш код имеет несколько проблем.

В C++ вы не можете использовать строковые литералы в операторах switch.

case 'APPLE':

Литеральные константы, разделенные одинарными кавычками, являются многосимвольными литералами. Это создает int где значения символа объединены в одно значение определенным образом.

Чтобы выполнить любое сопоставление шаблонов в C++, я рекомендую использовать std::regex.

using namespace std;

regex r0{"[a-zA-Z]*"};

string str = "APPLE ORANGE PEAR";

sregex_iterator ritr{str.begin(), str.end(), r0};
sregex_iterator rend;

while(ritr != rend){
    auto s = ritr->str();
    if(s == "APPLE"){
        cout << "I found an apple!" << endl;
    }
    if(s == "ORANGE"){
        cout << "I found an orange!" << endl;
    }
    if(s == "PEAR"){
        cout << "I found a pear!" << endl;
    }
    ++ritr;
}

Вы можете расширить это, используя std::map чтобы сопоставить сопоставленные строки ко всему (функтор был бы приятным).

  • 0
    Этот код не работает с моим компилятором g ++; есть неопределенная ссылка на sregex_iterator.
  • 0
    Вы #include <regex> ?
Показать ещё 1 комментарий
0

Вы можете использовать регулярное выражение для комплексного сопоставления шаблонов:

string s = "An apple a day keeps the doctor away and may be oranges too"; 

regex what("APPLE|ORANGE|etc", regex_constants::icase);  // what to search for
smatch sm;       
while (regex_search(s, sm, what)) {   // loop through found occurences 
    cout << "Found: " << sm.str() << endl;
    s = sm.suffix().str();
}

Это напечатает:

found apple
found orange

Конечно, вместо cout вы могли бы иметь предложение if:

if (sm.str()=="apple") {
    //...
} else if (sm.str()=="orange") {
    //...
} 

И если вы предпочитаете switch, вы можете создать map<string, int> m; ассоциировать каждую строку, которую вы ищете с int, и вы бы затем использовать эту Int в switch(m[sm.str()])

0

Если я правильно понял ваши вопросы, вам нужно что-то вроде этого:

#include <iostream>
#include <sstream>
using namespace std;

int main() {
    string text = "APPLE enter your source code or insert template or sample or your template";
    stringstream ss; // we need this for easy way to parse the input text
    ss.str(text);
    for (string word; ss >> word;) {
        cout << word << endl; // or do what ever you want with word
        if (word == "APPLE") {
            cout << "found an APPLE" << endl;
        } else if (word == "ORANGE") {
            //...
        }
    }
    return 0;
}

Вы можете играть вокруг этого кода здесь http://ideone.com/Rsr9ya

Ещё вопросы

Сообщество Overcoder
Наверх
Меню