用strtok_s拆分字符串
Splitting a string with strtok_s
我正在尝试根据此示例通过指定的分隔符拆分字符串:http://msdn.microsoft.com/en-us/library/ftsafwz3(v=VS.90).aspx
我的代码在 Visual C++ 2010 中编译时没有错误,但是当我想运行它时,我收到以下错误消息:
在 Test.exe 中0x773a15de时未处理的异常: 0xC0000005:访问冲突读取位置0x00000000。
这是我的代码:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <regex>
using namespace std;
vector<char *> splitString(char in[])
{
vector<char *> parts(15);
char seps[] = " ,tn";
char *next_token1 = NULL;
char *token1 = NULL;
token1 = strtok_s(in, seps, &next_token1);
while ((token1 != NULL))
{
if (token1 != NULL)
{
token1 = strtok_s( NULL, seps, &next_token1);
//printf( " %sn", token1 );
parts.push_back(token1);
}
}
return parts;
}
int main(int argc, char * argv[])
{
char string1[] =
"A stringtof ,,tokensnand some more tokens";
vector<char *> parts=splitString(string1);
cout << parts[0] <<endl;
cout << parts[1] <<endl;
return 0;
}
我尝试显示矢量的元素似乎是非法的,但为什么呢?
载体的容量应足够,并且
printf( " %s", token1 );
在 while 循环中打印出令牌!
vector
的使用不正确。它由15
元素构造,然后push_back()
用于添加字符串,这些字符串在最初的 15 个元素之后添加新元素。这意味着前15
元素未赋值 (null):
std::cout << parts[0] << end; // parts[0] is null
也:
- 不要在施工时预分配图元,或者
- 使用
operator[]
而不是push_back()
(添加额外的环路终结器以防止超出矢量末端)
(请考虑更改为 std::vector<std::string>
。
值得一提的是,boost::split()
可以从输入字符串生成令牌列表(std::vector<std::string>
),并允许指定多个分隔符。
麻烦的是 一般的警告:你在 c++ 中使用strtok
(系列)函数。请注意,这个旧的 API 修改了它的参数。这通常不是您所期望的,因此我建议不要使用此C
库函数。
此外,您假设将读取 15 个元素,而"剩余"元素未初始化。这也会导致访问这些元素时出现未定义的行为。
我可以建议一种C++的方法,因为您正在使用它:
#include <iostream>
#include <sstream>
#include <iterator>
#include <algorithm>
using namespace std;
vector<std::string> splitString(const char in[])
{
std::istringstream iss(in);
std::istream_iterator<std::string> first(iss), last;
std::vector<std::string> parts;
std::copy(first, last, std::back_inserter(parts));
return parts;
}
int main(int argc, char * argv[])
{
const char string1[] = "A stringtof ,,tokensnand some more tokens";
vector<std::string> parts = splitString(string1);
cout << parts[0] <<endl;
cout << parts[1] <<endl;
return 0;
}
这使用了这样一个事实,默认情况下,iostreams 将skipws
(跳过空格)
你可以考虑使用parts.emplace_back()而不是parts.push_back()但是您不必在构造函数中为向量设置大小,而是在初始化向量后使用 parts.reserve(15),而无需向构造函数传递任何参数。
- 我还可以添加什么来按空格或空格正确拆分C++字符串?
- 通过空行提升拆分字符串
- 如何按多个括号类型拆分字符串,但仍将括号保留在C++?
- 如何根据字符拆分字符串
- 在C++中拆分字符串的最佳做法
- 如何使用两个不同的分隔符拆分字符串
- 基于 C++ 中的多个字符串分隔符拆分字符串
- 拆分字符串输入并查找字符是否有效
- 使用 boost::split 按分隔符的前 N 次匹配来拆分字符串
- 如何在C 中不带有弦乐和strtok的情况下拆分字符串(提取单词)
- 为什么在黑客兰克的许多问题中都会完成拆分字符串
- C++拆分字符串反馈
- C++:按制表符拆分字符串,但包含空格
- 基于其中的数字子字符串拆分字符串
- 按空格拆分字符串并将列输出到不同的数组中
- C++ STL 在逗号处拆分字符串
- 如何根据某些字符拆分字符串?经度纬度
- 如何在 c++ 中拆分字符串的一部分
- 如何通过分隔符拆分字符串并将每个字符串放入不同的向量中
- 我如何在QT中的更多子字中拆分字符串