Strtok和Char *

时间:2014-04-30 09:54:34

标签: c++ strtok

我有一个简单的代码,我试图通过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*而我不能这样做。

4 个答案:

答案 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灵活得多, 并且它没有内部的所有缺点 国家意味着。