我遇到了一个问题,不知道为什么会这样。基本上我有一个讨厌的函数,它解析一个文本文件,并在所需的参数名称之后返回存储在一行中的多个值的下一个条目。它有效,我认为没有必要发布它的代码。但问题是:在循环内部我想使用一个衬垫将从 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位编译器。
答案 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"));