从字符串中获取单词,进行更改并将其放回正确的位置

时间:2014-09-17 16:08:58

标签: c++ string vector words

我正在尝试接收输入,无论它是什么。对这个词做点什么,然后把这个词回复给用户。这是事情,我不能限制用户输入他们想要的东西,所以我必须处理后果。在你们开始指责我之前,不,这不是一个功课。

我必须把话语放在各自的地方。所以,如果有人写

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

正如你在这里看到的那样,每当字符串数组中的空格不是字母时,我就会在子字符串上运行一个名为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;
}

它有很多积极的评论,但我不知道如何实现它并与我想要的工作。

我会编辑,因为你们问我问题。感谢

1 个答案:

答案 0 :(得分: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]);
    }

}