Итак, я вижу, что функция strtok кажется очень презираемой, но она действительно хорошо подходит для моих нужд в данном конкретном случае, и я хотел бы избежать необходимости переписывать всю эту функцию, если это возможно. Конечно, я готов согласиться с тем, что strtok должен уйти, если это действительно так.
В любом случае, вот проблема, которая у меня есть. Эта функция считывает указанную пользователем строку из файла конфигурации (это то, что происходит в первой строке). Эта строка представляет собой список, разделенный запятыми, содержащий пары чисел, разделенных двоеточием, например:
int:float, int:float, int:float
Я хочу хранить эти значения каким-то образом, который сопоставляет их друг с другом, при этом целые числа являются ключами, а числа с плавающей запятой — значениями. Код, который я написал для этого, работает именно так, как я хочу, пока либо первый int представляет собой только одну цифру, либо присутствует несколько пар int:float. Если в строке есть только одна пара int:float, а первое целое состоит из двух цифр, то функция будет выполняться несколько раз без проблем, но в конечном итоге в строки index_token и ratio_token будет прочитан мусор, и программа выдаст ошибку сегментации. Если я запускаю программу в valgrind, этого не происходит, значит, это какая-то ошибка памяти. Строка считывается из файла каждый раз, когда эта функция выполняется. Когда я распечатываю const_ratios и 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), но я не вижу, что мне не хватает.