函数返回string.c_str()作为atoi()意外行为的参数

时间:2015-07-11 14:38:23

标签: c++ function parameters atoi

我遇到了一个问题,不知道为什么会这样。基本上我有一个讨厌的函数,它解析一个文本文件,并在所需的参数名称之后返回存储在一行中的多个值的下一个条目。它有效,我认为没有必要发布它的代码。但问题是:在循环内部我想使用一个衬垫将从 atoi()返回的整数值赋给变量:

for (...)
{
    int fieldId = atoi(fileParser.getNextValueOfParameter("fieldIdArray").c_str());
    std::cout << fieldId << " ";
}

不幸的是,在第一次循环传递期间分配给 fieldId 变量的第一个值始终是 0 。其余值正确分配。

但是,当我使用字符串来存储我的解析函数返回的文本,然后将其转换后的数值分别分配给 int 时,而不是单行分配。一切都很完美:

for (...)
{
    std::string fieldIdString = fileParser.getNextValueOfParameter("fieldIdArray");
    int fieldId = atoi(fieldIdString.c_str());
    std::cout << fieldId << " ";
}

所有值都与我文件中存储的实际文本编号相对应。在第一次循环传递期间没有分配 0 值。

这两个代码仅在使用临时字符串变量来存储文本时才有所不同,然后在 atoi()中将其转换为 .c_str() ,作为参数。

为什么会这样? 如果这很重要,我正在使用TDM-GCC 4.7.1 32位编译器。

2 个答案:

答案 0 :(得分:0)

atoi基本上将具有数字的字符串转换为整数1,并且将转换的任何字符串将成为它的返回值。或者更精确的atoi函数从字符串的开头开始检查。如果它有数字(仅从开始),那么它将以整数形式返回该值。下面的例子将清除概念例如

atoi("1234") 
--> it will convert string "1234" in to integer and return it 
--> i.e. ouput is 1234
atoi("1234abcd") --> i.e. ouput is 1234
atoi("a1234abcd") --> i.e. ouput is 0

因此,如果您的字符串首先包含字符然后是整数,那么它将提供所需的输出。另请阅读http://www.cplusplus.com/reference/cstdlib/atoi/

答案 1 :(得分:0)

您应该在C++

中进行更改
int fieldId = atoi(fieldIdString.c_str());

int fieldId = std::stoi(fieldIdString);

int fieldId = std::stoi(fileParser.getNextValueOfParameter("fieldIdArray"));