Получить слово из строки, изменить его и вернуть обратно в нужное место

0

Я пытаюсь получить вход, каким бы он ни был. Сделайте что-нибудь слово, а затем верните слово обратно пользователю. Вот что я не могу ограничить, чтобы пользователь вводил все, что захочет, поэтому мне приходится иметь дело с последствиями. Прежде чем вы, ребята, начнете обвинять меня, нет, это не домашнее задание.

Я должен держать слова в своих местах. Поэтому, если кто-то пишет

> "  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;
}

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

Я отредактирую, так как вы, ребята, задаете мне вопросы. благодаря

  • 0
    -1, о человек, пожалуйста, правильно сделайте отступ для вашего первого кода, на данный момент он выглядит ужасно.
  • 0
    Вылетает? Пробел - это не символ, буква или цифра. Вы можете проверить, что вводит пользователь, чтобы убедиться, что это любой символ, любая буква или любое число. Вы можете быть ограничены кодированием и предоставлением C или компиляторами, такими как «Без пробелов».
Показать ещё 1 комментарий
Теги:
string
vector
words

1 ответ

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

Вы можете сделать что-то вроде этого:

#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]);
    }

}
  • 0
    Это очень помогает, спасибо
  • 0
    @Ali Я не собираю баллы, но в общем случае на stackoverflow принято принимать ответ, который вы считаете наиболее подходящим для вашего вопроса. Здесь это не имеет большого значения, потому что ваш вопрос слишком конкретен, но все же.
Показать ещё 5 комментариев

Ещё вопросы

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