Я пытаюсь получить вход, каким бы он ни был. Сделайте что-нибудь слово, а затем верните слово обратно пользователю. Вот что я не могу ограничить, чтобы пользователь вводил все, что захочет, поэтому мне приходится иметь дело с последствиями. Прежде чем вы, ребята, начнете обвинять меня, нет, это не домашнее задание.
Я должен держать слова в своих местах. Поэтому, если кто-то пишет
> " he*llo !w3rld ."
Я должен держать метасимволы на своих местах.
Поэтому давайте скажем, что изменение было просто для борьбы. Он должен выводить
> " eh*olo !w3ldr ."
То, что я хочу сделать со словом, когда я его получаю, не имеет значения. Единственная проблема, с которой я столкнулась, - это распознать слово, что-то сделать и вернуть его.
Чтобы вы поняли лучше, вот мой нижеприведенный код
int main(){
string str;
cout<<"Enter a string: ";
getline(cin, str);
cout<<endl;
str= str + " ";
int wordFirstLetter = 0;
int currentWordLen = 0;
int p=0;
while((unsigned)p <str.length())
{
if (isalpha(str[p])) // if letter
{
str[p] = tolower(str[p]);
currentWordLen++;
}
else if(!isalpha(str[p])) { //if no letter
cout <<change(str.substr(wordFirstLetter,currentWordLen)) + " ";
wordFirstLetter = p+1;
//currentWordLen++;
currentWordLen = 0;
}
p++;
//cout<<wordFirstLetter<<" "<<currentWordLen<<endl;
}
return 0;
}
Как вы можете видеть здесь, я запускаю функцию aa, называемую change в подстроке, каждый раз, когда пространство в массиве строки не является буквой. Но это терпит неудачу, потому что если предложение начинается с пробела или имеет несколько пробелов, программа сработает.
Я оглядывался и много думал об этом. Там должно быть два состояния, где я нахожу письмо, а где нет. Если я найду что-нибудь, прежде чем я удалю хотя бы одно письмо, я смогу его распечатать.
Мне нужно сохранить это письмо в каком-то другом пространстве, пока я продолжаю смотреть в предложение. Когда я ударяю то, что не является буквой, мне нужно изменить слово и напечатать его вместе с тем, что я ударил, а затем сбросить пространство и продолжить движение. Я просто не могу обойти мою голову, как это сделать.
Нет необходимости использовать регулярные выражения, я чувствую, что это будет излишним. Поэтому, пожалуйста, не приходите ко мне с современными библиотеками регулярных выражений и пытайтесь научить их мне, а так как я не пишу в жемчужине, где интегрировано регулярное выражение, я им не нужен. И нет необходимости использовать конечные машины.
Я чувствую, что это такая легкая вещь, но я просто не могу попасть туда.
В другом потоке кто-то предложил приведенный ниже код найти слова
std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) {
std::stringstream ss(s);
std::string item;
while (std::getline(ss, item, delim)) {
elems.push_back(item);
}
return elems;
}
std::vector<std::string> split(const std::string &s, char delim) {
std::vector<std::string> elems;
split(s, delim, elems);
return elems;
}
У него много положительных отзывов, но я не знаю, как это реализовать и работать с тем, что я хочу.
Я отредактирую, так как вы, ребята, задаете мне вопросы. благодаря
Вы можете сделать что-то вроде этого:
#include <vector>
#include <string>
#include <iostream>
std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) {
std::stringstream ss(s);
std::string item;
while (std::getline(ss, item, delim)) {
if ( item.lenght() > 0) { // This checks if the string is not empty, to filter consecutive white space.
elems.push_back(item);
}
}
return elems;
}
std::string doSomething(const std::string original) {
// do whatever you want with original which is a word.
return modified; // where modified is std::string
}
int main() {
std::string input;
std::vector<string> listOfWords;
std::cout << "Input your phrase :" << std::endl;
std::cin >> input;
split(input, " ", &listOfWords);
for(int i = 0; i < listOfWords.size(); i++) {
std::cout << "Input was : " << listOfWords[i]
<< "now is : " << doSomething(listOfWords[i]);
}
}