【发布时间】:2015-09-30 05:40:46
【问题描述】:
我遇到了一个问题,不知道为什么会发生。基本上我有一个讨厌的函数,它解析一个文本文件并返回存储在所需参数名称之后的一行中的多个值的下一个条目。它有效,我认为没有必要发布它的代码。但问题是:在一个循环中,我想使用一个单行来将从 atoi() 返回的整数值分配给一个变量:
for (...)
{
int fieldId = atoi(fileParser.getNextValueOfParameter("fieldIdArray").c_str());
std::cout << fieldId << " ";
}
不幸的是,在第一次循环过程中分配给 fieldId 变量的第一个值始终是 0。其余值均已正确分配。
但是,当我使用 string 来存储解析函数返回的文本而不是单行赋值时,然后将其转换后的数值分别分配给 int -一切正常:
for (...)
{
std::string fieldIdString = fileParser.getNextValueOfParameter("fieldIdArray");
int fieldId = atoi(fieldIdString.c_str());
std::cout << fieldId << " ";
}
所有值都对应于存储在我的文件中的实际文本编号。在第一次循环过程中没有分配 0 值。
这两个代码的不同之处仅在于使用临时 string 变量来存储文本,然后将其转换为 atoi() 中的 .c_str() ,作为它的参数。
为什么会这样? 如果这很重要,我正在使用 TDM-GCC 4.7.1 32 位编译器。
【问题讨论】:
-
为什么在 C++ 程序中使用
atoi? -
@JonathonReinhart,因为有了这个错误的编译器版本,我无法使用 std::stoi,我想要一个快速的解决方法,即 atoi()我希望它能够工作。
-
getNextValueOfParameter的返回类型是什么?分成两行有两件事:(1)它延长了返回值的生命周期,(2)如果返回值是一个引用,它会复制返回值。 -
@RaymondChen,它是一个 std::string,在这种情况下,在这个特定循环中,它始终是一组数字字符:1 , 12, 88 等,没有字母或其他符号。然后我想将它作为参数传递给 atoi() 并且在我的函数评估之后还包括 .c_str() 因为 atoi() 需要C 风格的字符串。所以它应该首先获取一个 string,然后将其转换为 C 风格的字符串,最后将结果作为 atoi() 参数传递,但正如我所说它不起作用和使用临时变量一样,只是存储一个函数返回的字符串,然后分别转换
-
@wowowo:
fileParser.getNextValueOfParameter()是如何定义的?无法从您发布的内容中明确地说出,但我怀疑未定义的行为在这里起作用。就像您的fileParser.getNextValueOfParameter("fieldIdArray")返回对局部变量的引用,然后将c_str()应用于该死引用。
标签: c++ function parameters atoi