【问题标题】:Error in strtok split using c++使用c ++进行strtok拆分时出错
【发布时间】:2013-10-26 10:42:52
【问题描述】:

我必须使用 C++ 使用 strok 函数拆分示例字符串。 示例字符串是:"This|is||a||sample||string|",而通常使用strok 拆分它。

#include <stdio.h>
#include <string>
#include <string.h>
using namespace std;

int main()
{   
string  str="This||a||sample||string|";

string a;

str=strtok ((char *)str.c_str(),"|");

while (str.c_str() != NULL)
{
    printf ("str:%s\n",str.c_str());

    str = strtok (NULL, "|");

}

return 0;
}

结果:

str:This

str:a
str:sample

str:string

将相同的字符串更改为"This| |a| |sample| |string|" 会得到预期的结果:

str:This

str: 

str:a

str: 

str:sample

str: 

str:string

如何在不更改字符串的情况下获得预期结果?

【问题讨论】:

  • 根据ideone,您的示例会导致运行时错误。你确定你发布了正确的代码吗? str=strtok ((char *)str.c_str(),"|"); 对我来说有点奇怪..
  • int main() { char str[]="This| |a| |sample| |string|";字符 *ptr; ptr=strtok ((char *)str,"|"); while (ptr != NULL) { printf ("str:%s\n",ptr); ptr = strtok (NULL, "|"); } 返回 0; } 使用此代码
  • 您可以使用问题正下方的编辑按钮edit 您的问题。我建议你在那里添加你的代码。
  • 请注意 c_str 是一个 const 值。你不应该以你的方式操纵它。您是否尝试将其复制到 char 缓冲区(或尝试搜索可以拆分 std::string 的方法)?

标签: c++


【解决方案1】:

std::string 上使用std::strtok 将产生未定义的行为,因为std::strtok 具有破坏性(提示:std::string::c_str() 返回const char*)。

改为多次使用std::string::findstd::string::substr

#include <iostream>
#include <string>
#include <iterator>

template <class OutputIt>
OutputIt safe_tokenizer(const std::string & s, char token, OutputIt out){
  std::string::size_type pos = 0, f;  
  while((f = s.find(token, pos)) != std::string::npos){    
    *out++ = s.substr(pos, f - pos);
    pos = f + 1;
  }
  if(pos < s.size())
    *out++ = s.substr(pos);
  return out;
}

int main(){
  const std::string str = "Hello|World|How|Are|You";
  safe_tokenizer(str, '|', std::ostream_iterator<std::string>(std::cout, "\n"));
  return 0;
}

【讨论】:

    【解决方案2】:

    printf? strtok?您仍在使用 C 进行编码。而 C 库(大多数时候)并不是用 C++ 做事的好方法。

    在 C++ 中,我们倾向于避免使用裸指针、C 数组和 C 字符串进行操作,而是使用 STL 或 Boost 工具。

    查看this thread 以获取“在真实 C++ 中”的完整示例

    编辑:这是另一个thread,更好。

    Edit2:如果您查看此页面的右侧,您可以找到“相关”列,其中包含许多关于您的主题的有用链接 =)

    【讨论】:

    • 如果这个问题感觉像重复,请将其标记为重复。请注意,您的“答案”并没有真正回答问题。
    • @Zeta,不幸的是,我的代表还没有那么高,标记为重复。你认为从这些主题中复制粘贴代码 sn-ps 更好吗?
    • 你对flag it 有足够的声望,即使你还不能投接近票。如果您没有标记/关闭投票,最好对问题发表评论。
    • @Zeta 酷!感谢您的解释! ;)
    【解决方案3】:

    试试 strtok 函数

    char * TOKEN;
    char * mystrtok( char * string,
        const char * control)
    {
        char * str=NULL;
        if(string == NULL)
        {
            str = TOKEN;
            if(*str == 0)
            return NULL;
        }
        else
            str = string;
    
        string = str;
        for ( ; *str ; str++ )
        {
            if(*str == *control)
            {   
                *str++ = '\0';
                break;
            }
    
        }
    
        TOKEN = str;
        return string;
    
    }
    

    【讨论】:

      猜你喜欢
      • 2015-12-26
      • 1970-01-01
      • 2014-01-21
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 2020-11-30
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多