我有一个简单的代码,我试图通过char*
并将其分成单独的单词。这是我的简单代码。
#include <iostream>
#include <stdio.h>
int main ()
{
char * string1 = "- This is a test string";
char * character_pointer;
std::cout << "Splitting stringinto tokens:" << string1 << std::endl;
character_pointer = strtok (string1," ");
while (character_pointer != NULL)
{
printf ("%s\n", character_pointer);
character_pointer = strtok (NULL, " ");
}
return 0;
}
我收到的错误不允许我这样做。
所以我的问题是,如何查找char*
中的每个单词。对于我正在处理的实际程序,我的一个库返回一段单词作为const char*
,我需要使用词干算法来阻止每个单词(我知道如何做到这一点,我只是不知道如何将每个单词发送给词干分析器)。如果有人可以解决如何使示例代码工作,我将能够弄明白。所有在线示例都使用char[]
代替string1
代替char*
而我不能这样做。
答案 0 :(得分:1)
这是我在c ++中分割字符串时最简单的(代码方式)方法:
std::string string1 = "- This is a test string";
std::string word;
std::istringstream iss(string1);
// by default this splits on any whitespace
while(iss >> word) {
std::cout << word << '\n';
}
或者像这样,如果你想指定一个分隔符。
while(std::getline(iss, word, ' ')) {
std::cout << word << '\n';
}
答案 1 :(得分:0)
在C ++中有不同的方法可以做到这一点。
如果空格是您的分隔符,那么您可以通过这种方式获取令牌:
std::string text = "- This is a test string";
std::istringstream ss(text);
std::vector<std::string> tokens;
std::copy(std::istream_iterator<std::string>(ss),
std::istream_iterator<std::string>(),
std::back_inserter<std::vector<std::string>>(tokens));
您还可以使用正则表达式在C ++中对字符串进行标记。
std::string text = "- This is a test string";
std::regex pattern("\\s+");
std::sregex_token_iterator it(std::begin(text), std::end(text), pattern, -1);
std::sregex_token_iterator end;
for(; it != end; ++it)
{
std::cout << it->str() << std::endl;
}
答案 2 :(得分:0)
这是一个更正版本,试试看:
#include <iostream>
#include <stdio.h>
#include <cstring>
int main ()
{
char string1[] = "- This is a test string";
char * character_pointer;
std::cout << "Splitting stringinto tokens:" << string1 << std::endl;
character_pointer = strtok (string1," ");
while (character_pointer != NULL)
{
printf ("%s\n", character_pointer);
character_pointer = strtok (NULL, " ");
}
return 0;
}
答案 3 :(得分:0)
忘掉strtok
。准确地得到你的样子
旨在:
std::string const source = "- This is a test string";
std::vector<std::string> tokens;
std::string::const_iterator start = source.begin();
std::string::const_iterator end = source.end();
std::string::const_iterator next = std::find( start, end, ' ' );
while ( next != end ) {
tokens.push_back( std::string( start, next ) );
start = next + 1;
next = std::find( start, end, ' ' );
}
tokens.push_back( std::string( start, next ) );
当然,这可以根据需要进行修改:您可以使用
std::find_first_of
您想要多个分隔符,或者
std::search
如果你想要一个多字符分隔符,甚至是
std::find_if
用于任意测试(如果有的话,使用lambda)
C ++ 11)。在大多数你正在解析的情况下,你可以
只需传递两个迭代器,而不必构造
子串;你只需要构造一个子串
想要将提取的令牌保存在某处。
一旦习惯使用迭代器和标准
算法,你会发现它比strtok
灵活得多,
并且它没有内部的所有缺点
国家意味着。