如何将任意长度的句子拆分成单词并将它们存储到变量c ++
How to split a sentence of any length into words and store them into variables c++
我需要一些帮助来制作一个将句子拆分成单词的函数,这个函数应该适用于不同长度的句子。
示例代码如下:
void spilt_sentence(string sentence)
{}
int main()
{
std::string sentence1= "Hello everyone";
std::string sentence2= "Hello I am doing stuff";
split_sentence(sentence1);
split_sentence(sentence2);
return 0;
}
我看到有人使用 std::istringstream 来获取每个 space 之前的每个单词,但我真的不知道它是如何工作的。当我输入 std::istringstream ss(sentence); 时它给我错误在代码中。另外,我使用的是 c++98,我用 cygwin 编译我的程序。有线索吗?谢谢。
编辑:该函数将根据句子中的单词数量创建多个变量。
编辑:我实际上正在开发一个 LinkedList 程序,我在这里要做的是将句子拆分成单词,然后生成包含每个单词的新节点。
这是实际的代码(注意:我稍微修改了一下,所以它与我的实际代码不完全一样。而且我没有为 Node 使用 struct),假设句子 1 是 "Hello everyone"句子 2 是 "Hello I am doing stuff".
The expected output will be:
linkedlist1:
"hello"<->"everyone"
linkedlist2:
"hello"<->"I"<->"am"<->"doing"<->"stuff"
里面 LinkedList.cpp:
void LinkedList::add(std::string sentence)
{
//breaks down the sentence into words
std::istringstream ss(sentence);
do
{
std::string word;
ss >> word;
//store them in nodes in a linkedlist
Node* new_tail = new Node(word);
if (size == 0)
{
head = new_tail;
tail = new_tail;
}
else
{
new_tail->set_previous(tail);
tail->set_next(new_tail);
tail = new_tail;
}
new_tail = NULL;
size++;
}
while(ss);
}
[已修复]编译时弹出错误信息,说std::istringstream ss有默认设置但类型不完整。我该怎么办?
error
这是使用流的函数,此函数仅适用于向量,您不能将此函数用于数组,但如果您愿意,可以为您修改。
这是代码和用法示例
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>
#include <iostream>
using namespace std;
void split_sentence(const string& str, vector<string>& cont)
{
istringstream iss(str);
copy(istream_iterator<string>(iss),
istream_iterator<string>(),
back_inserter(cont));
//checking for punctuation marks and if found, we remove them from the word
for(int i = 0, sz = cont.size(); i < sz; i++){
string word = cont.at(i);
for(int j = 0, len = word.length(); j < len; j++){
if(ispunct(word[j])){
cont.at(i) = word.substr(0, word.length() - 1);
}
}
}
}
int main(){
string sentence = "this is a test sentence for Whosebug!";
vector<string> words;
split_sentence(sentence, words);
for(int i = 0, sz = words.size(); i < sz; i++){
cout<<words.at(i) << endl;
}
return 0;
}
这是输出
this
is
a
test
sentence
for
Whosebug
如果您还想打印标点符号,请删除函数中的双循环。
我需要一些帮助来制作一个将句子拆分成单词的函数,这个函数应该适用于不同长度的句子。
示例代码如下:
void spilt_sentence(string sentence)
{}
int main()
{
std::string sentence1= "Hello everyone";
std::string sentence2= "Hello I am doing stuff";
split_sentence(sentence1);
split_sentence(sentence2);
return 0;
}
我看到有人使用 std::istringstream 来获取每个 space 之前的每个单词,但我真的不知道它是如何工作的。当我输入 std::istringstream ss(sentence); 时它给我错误在代码中。另外,我使用的是 c++98,我用 cygwin 编译我的程序。有线索吗?谢谢。
编辑:该函数将根据句子中的单词数量创建多个变量。
编辑:我实际上正在开发一个 LinkedList 程序,我在这里要做的是将句子拆分成单词,然后生成包含每个单词的新节点。
这是实际的代码(注意:我稍微修改了一下,所以它与我的实际代码不完全一样。而且我没有为 Node 使用 struct),假设句子 1 是 "Hello everyone"句子 2 是 "Hello I am doing stuff".
The expected output will be:
linkedlist1:
"hello"<->"everyone"
linkedlist2:
"hello"<->"I"<->"am"<->"doing"<->"stuff"
里面 LinkedList.cpp:
void LinkedList::add(std::string sentence)
{
//breaks down the sentence into words
std::istringstream ss(sentence);
do
{
std::string word;
ss >> word;
//store them in nodes in a linkedlist
Node* new_tail = new Node(word);
if (size == 0)
{
head = new_tail;
tail = new_tail;
}
else
{
new_tail->set_previous(tail);
tail->set_next(new_tail);
tail = new_tail;
}
new_tail = NULL;
size++;
}
while(ss);
}
[已修复]编译时弹出错误信息,说std::istringstream ss有默认设置但类型不完整。我该怎么办?
error
这是使用流的函数,此函数仅适用于向量,您不能将此函数用于数组,但如果您愿意,可以为您修改。 这是代码和用法示例
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>
#include <iostream>
using namespace std;
void split_sentence(const string& str, vector<string>& cont)
{
istringstream iss(str);
copy(istream_iterator<string>(iss),
istream_iterator<string>(),
back_inserter(cont));
//checking for punctuation marks and if found, we remove them from the word
for(int i = 0, sz = cont.size(); i < sz; i++){
string word = cont.at(i);
for(int j = 0, len = word.length(); j < len; j++){
if(ispunct(word[j])){
cont.at(i) = word.substr(0, word.length() - 1);
}
}
}
}
int main(){
string sentence = "this is a test sentence for Whosebug!";
vector<string> words;
split_sentence(sentence, words);
for(int i = 0, sz = words.size(); i < sz; i++){
cout<<words.at(i) << endl;
}
return 0;
}
这是输出
this
is
a
test
sentence
for
Whosebug
如果您还想打印标点符号,请删除函数中的双循环。