Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从字符串中获取一个单词,更改它,然后将其放回正确的位置_C++_String_Vector_Words - Fatal编程技术网

C++ 从字符串中获取一个单词,更改它,然后将其放回正确的位置

C++ 从字符串中获取一个单词,更改它,然后将其放回正确的位置,c++,string,vector,words,C++,String,Vector,Words,我正在尝试接收输入,不管它是什么。对这个词做点什么,然后将这个词返回给用户。问题是,我不能限制用户输入他们想要的任何内容,因此我必须处理后果。在你们开始指责我之前,不,这不是家庭作业 我必须把这些词放在它们各自的地方。所以如果有人写信 > " he*llo !w3rld ." 我必须保持元字符在它们的位置 所以,让我们说改变只是为了争夺。它必须输出 > " eh*olo !w3ldr ." 一旦我检索到这个词,我想对它做什么是不相关的。我唯一的问题是,我真的能认出这个词,

我正在尝试接收输入,不管它是什么。对这个词做点什么,然后将这个词返回给用户。问题是,我不能限制用户输入他们想要的任何内容,因此我必须处理后果。在你们开始指责我之前,不,这不是家庭作业

我必须把这些词放在它们各自的地方。所以如果有人写信

> "  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的函数。但这失败得很惨,因为如果句子以空格开头或有多个空格,那么程序就会崩溃

我一直在环顾四周,对此思考了很多。需要有两个状态,在那里我找到一封信,在那里我没有。如果我在打到一个字母之前就发现了什么,我可以把它打印出来

我需要把那封信保存在其他地方,同时我还要继续看句子内部。当我碰到一些不是字母的东西时,我需要更改单词并将其与我碰到的任何东西一起打印,然后重置空格并继续。我就是想不起这样做的方法

没有必要使用正则表达式,我觉得这样做太过分了。所以请不要带着现代的正则表达式库来找我,试着教我,因为我不是在整合正则表达式的pearl中写作,所以我对它们没有任何用处。并且没有必要使用有限状态机

我觉得这件事很简单,但我就是做不到

在另一个线程中,有人建议使用下面的代码来查找单词

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

}

-1,哦,伙计,请正确缩进你的第一个代码,现在看起来很糟糕。它崩溃了?空格不是字符、字母或数字,您可以检查用户输入的内容,以确保它是任意字符、任意字母或任意数字。你可能会被限制在C或编译器中,比如没有空格。我唯一的问题是,然后继续下去,列出你需要做的所有子任务。“Ali,我不是在捕鱼,但是在StAcExpod上一般是很好的做法,接受你认为最适合你的问题的答案。在这里,这并不重要,因为您的问题有点过于具体,但仍然是。Felix我如何为这段代码指定多个分隔符?除了字母表中的一个字母外,我怎么能指定一个分隔符呢?我真的不知道如何选择你的答案作为最佳答案。但是我没有任何东西可以与之比较。你可以点击箭头旁边的一个勾号,对答案左上角的答案进行投票。我之所以建议这样做,是因为如果你有太多的问题没有被接受的答案,那看起来很糟糕。我将编辑答案,让您了解如何匹配模式而不是字符。如果您只是担心2个连续的空格,那么您可以在将其添加到向量之前检查每个字符串是否为空。如果你真的需要过滤除信件以外的所有东西,那么看看听者。这是c++11,所以您需要一个最新的编译器。如果编译器太旧,您可以在boosttr1中找到类似的库。正则表达式可以非常有效地表达此类查询和过滤器。如果你不了解他们,就去学习。这是一项非常有用的技能。