2015-07-11 71 views
0

我遇到了一个问题,不知道它为什么发生。基本上我有一个讨厌的函数,它解析一个文本文件并返回所需参数名称后存储在一行中的多个值的下一个条目。它的工作原理,我不认为有必要发布其代码。但问题是:在一个循环中我想用一个衬垫)从的atoi(返回一个整数值赋值给一个变量:函数返回string.c_str()作为atoi()意外行为的参数

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

不幸的是分配给第一个值fieldId期间变量第一轮循环总是。剩下的值分配正确。

但是,不是一个班轮分配当我使用字符串来存储我的解析函数返回的文本,然后单独进行转换后的数字值分配给 INT - 一切完美:

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

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

这两个代码仅在使用临时变量来存储文本的一个问题是不同的,将其转换为 .c_str()内部的atoi(),作为它的参数之前。

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

+1

? –

+0

@JonathonReinhart,因为有了这个错误的编译器版本,我不能使用_std :: stoi_,我想要一个快速的解决方法,它是_atoi()_,我希望它能够工作。 – wowowo

+1

getNextValueOfParameter的返回类型是什么?分成两行会做两件事:(1)它延长了返回值的生命周期,并且(2)如果返回值是一个引用,它会复制返回值。 –

回答

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 

所以,如果你的字符串包含字符首先那么整数,它会给weired输出。还可以阅读http://www.cplusplus.com/reference/cstdlib/atoi/

+0

_fieldIdString_的内容始终是一组数字字符。我提供了一个例子,其中所有东西都按照它应该的方式工作,但是它使用了一个额外的临时_string_变量赋值,然后将其作为_c_str()_传递给_atoi()_,我不明白它为什么不能作为一个当我的_string_返回函数和转换为_c_str()_时,它们都被计算为_atoi()_参数。 – wowowo

0

你应该你为什么要使用C++程序`atoi`在C++

int fieldId = atoi(fieldIdString.c_str()); 

更改为

int fieldId = std::stoi(fieldIdString); 

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