现在问题似乎已经解决了,感谢https://stackoverflow.com/users/2609288/baldrick对他的回应,他指出了导致我认为atoi的主要问题是回归错误的价值。 由于我使用AllocConsole将结果打印到控制台窗口中,我猜cout在打印一些高值的整数后错误地打印结果,这确实是这种情况。
所以我在问这个之前就四处寻找,我似乎找不到任何与我有类似情况的人,所以我会在这里问。
我有一个配置文件,其中包含不按递增顺序排列的ID,例如:
48|0:0:0.001:0
49|0:0:0.001:0
59|0:0:0.001:0
60|497:0:0.001:0
61|504:0:0.001:1
63|0:0:0.001:0
500|0:0:0.001:0
505|0:0:0.001:0
506|0:0:0.001:0
507|0:0:0.001:0
508|0:0:0.001:0
509|0:0:0.001:0
512|0:0:0.001:0
515|0:0:0.001:0
516|0:0:0.001:0
517|415:132:0.001:1
现在,当我尝试从文件中读取这些值并使用atoi将它们解析为int时会出现问题,当我将其转换为int时,517将变为202或者像这样的随机数,是这种正常行为?以下是我如何解析文件并转换ID的示例:
std::vector<std::string> x = split(line, '|');
int id = atoi(x[0].c_str());
cout << id << " ";
std::vector<std::string> x2 = split(line, ':');
int kit = atoi(x2[0].c_str());
cout << kit << " ";
int seed = atoi(x2[1].c_str());
cout << seed << " ";
int wear = atoi(x2[2].c_str());
cout << wear << " ";
int stat = atoi(x2[3].c_str());
cout << stat << endl;
this->ParseSkin(id, kit, seed, wear, stat);
在这种情况下使用atoi会不正确吗?
答案 0 :(得分:5)
问题是您使用line
重新分配了相同的:
变量,因此x2[0]
将包含“48 | 0”。这不是atoi
的有效输入。
请改为尝试:
std::vector<std::string> x = split(line, '|');
int id = atoi(x[0].c_str());
cout << id << " ";
std::vector<std::string> x2 = split(x[1], ':');
int kit = atoi(x2[0].c_str());
这应该会更好,因为你第二次将有效输入传递给split
。
答案 1 :(得分:1)
使用strtol
代替atoi
。它可以停在任何非数字字符处。试试这个:
char * str = line;
id = strtol( str, &str, 10 ); str++;
kit = strtol( str, &str, 10 ); str++;
seed = strtol( str, &str, 10 ); str++;
wear = strtol( str, &str, 10 ); str++;
stat = strtol( str, &str, 10 );