gpt4 book ai didi

c++ - 使用 strtok 复制部分字符串时出现内存错误

转载 作者:行者123 更新时间:2023-11-30 04:11:45 25 4
gpt4 key购买 nike

因此,我可以看出 strtok 似乎是一个备受鄙视的函数,但它确实非常适合我在这个特定实例中的需求,如果可能的话,我想避免重写整个函数。当然,如果确实如此,我愿意接受 strtok 必须离开的事实。

无论如何,这就是我遇到的问题。此函数正在从配置文件中读取用户指定的字符串(这就是第一行中发生的事情)。该字符串是一个逗号分隔的列表,包含由冒号分隔的数字对,如下所示:

    int:float, int:float, int:float

我想以某种方式存储这些值,将它们相互映射,整数是键, float 是值。只要第一个 int 只是一个数字,或者存在多个 int:float 对,我为此编写的代码就可以按照我想要的方式工作。如果字符串只有一个 int:float 对并且第一个 int 是两位数字,那么该函数将执行几次没有问题,但最终会将垃圾读入 index_token 和 ratio_token 字符串,程序将出现段错误。如果我在 valgrind 中运行该程序,则不会发生这种情况,因此它一定是某种内存错误。每次执行此函数时,都会从文件中读取新的字符串。当我打印出 const_ratios 和比率时,它们每次都应该是这样。

这是我的代码:

const char * const_ratios = m_world->GetConfig().NON_1_RESOURCE_RATIOS.Get();
cout << "Const_ratios: " << const_ratios;

char * ratios = new char[strlen(const_ratios)]; #make non const version of ratios
strcpy(ratios, const_ratios); #so that I can use strtok
cout << ", Ratios: " << ratios;

map<int, float> ratioMap;
char * ratio_tokens = strtok((char *)ratios, ",:");
while (ratio_tokens != NULL){

char * index_token = new char[strlen(ratio_tokens)];
strcpy(index_token, ratio_tokens);
cout <<", Index token: " << index_token;

ratio_tokens = strtok(NULL, ",:");
char * value_token = new char[strlen(ratio_tokens)];
strcpy(value_token, ratio_tokens);
cout << ", Value token: " << value_token << endl;

ratioMap[atoi(index_token)] = atof(value_token);
ratio_tokens = strtok(NULL, ",:");

有谁知道为什么会发生这种情况?我认为它一定与 strtok 有关(可能与 strcpy 相关),但我看不出我遗漏了什么。

最佳答案

对于C字符串,它需要字符串末尾的终止空字符,所以你的代码:

char * ratios = new char[strlen(const_ratios)]; 
strcpy(ratios, const_ratios);

终止空字符未附加字符串 'ratios',这将导致其他函数出现问题。例如,函数“strcpy()”,如果您检查函数的实现,它会检查源字符串的终止空字符以确定复制过程是否完成。所以如果没有终止null char,就会导致内存错误。

所以上面的代码应该是这样的:

int n = strlen(const_ratios) +1
char * ratios = new char[n];
strcpy(ratios, const_ratios);
ratios[n-1] = '\0'

关于c++ - 使用 strtok 复制部分字符串时出现内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20105013/

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