gpt4 book ai didi

c++ - 使用 strtok_s 拆分字符串

转载 作者:行者123 更新时间:2023-11-30 02:02:52 32 4
gpt4 key购买 nike

我正在尝试根据此示例通过指定的分隔符拆分字符串:http://msdn.microsoft.com/en-us/library/ftsafwz3(v=VS.90).aspx

我的代码在 Visual C++ 2010 中编译没有错误,但是当我想运行它时,我收到此错误消息:

Unhandled exception at 0x773a15de in Test.exe: 0xC0000005: Access violation reading location 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[] = " ,\t\n";
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( " %s\n", token1 );
parts.push_back(token1);
}
}
return parts;
}

int main(int argc, char * argv[])
{
char string1[] =
"A string\tof ,,tokens\nand some more tokens";
vector<char *> parts=splitString(string1);
cout << parts[0] <<endl;
cout << parts[1] <<endl;
return 0;
}

我尝试显示 vector 的元素似乎是非法的,但为什么呢?

vector的容量要够用

printf( " %s\n", token1 );

在 while 循环中打印出标记!

最佳答案

vector的使用是不正确的。它由 15 构成元素然后push_back()用于添加在初始 15 之后添加新元素的字符串。这意味着第一个 15元素未分配(空):

std::cout << parts[0] << end; // parts[0] is null

或者:

  • 不要在构造时预分配元素,或者
  • 使用operator[]而不是 push_back() (添加额外的循环终止符以保护超出 vector 末尾)

(考虑改为 std::vector<std::string> 。)

只是提一下 boost::split() 可以从输入字符串生成标记列表 ( std::vector<std::string> ) 并允许指定多个分隔符。

关于c++ - 使用 strtok_s 拆分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12704337/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com