Я хочу создать программу, которая анализирует строку и что-то делает, если найдено слово внутри строки. Вот что я получил:
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 неверно.
Вам нужно будет использовать таблицу поиска, std::map
или if-else 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 (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";
}
Есть несколько вопросов.
В C++ вы не можете использовать строки включения.
Начальная позиция вашего поиска (strPos) неинициализирована в вашем коде
Даже если это 0,
str.find(str, strPos)
возвращает начальную позицию самой строки (= 0), см. строку :: find
"APPLE" не является строкой, "APPLE" будет.
Как также указано в комментариях, когда я вводил этот ответ, используйте
if (str == "APPLE")
{...}
else if (str == "ORANGE")
{...}
else
{...}
Редактировать:
Помимо некоторых синтаксических ошибок, ваш код имеет несколько проблем.
В 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
чтобы сопоставить сопоставленные строки ко всему (функтор был бы приятным).
#include <regex>
?
Вы можете использовать регулярное выражение для комплексного сопоставления шаблонов:
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()])
Если я правильно понял ваши вопросы, вам нужно что-то вроде этого:
#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
switch()
со строками, только с целыми числами.