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中找到类似的库。正则表达式可以非常有效地表达此类查询和过滤器。如果你不了解他们,就去学习。这是一项非常有用的技能。