【问题标题】:Function returned string.c_str() as a parameter of atoi() unexpected behaviour函数返回 string.c_str() 作为 atoi() 意外行为的参数
【发布时间】: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


【解决方案1】:

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/

【讨论】:

  • fieldIdString 的内容总是排他的一组数字字符。我提供了一个示例,其中一切都按预期工作,但它使用额外的临时 string 变量赋值,然后将其作为 c_str() 传递给 atoi () 并且我不明白为什么当我的 string 返回函数和对 c_str() 的转换都被评估为atoi() 参数。
【解决方案2】:

您应该在 C++ 中更改此设置

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

int fieldId = std::stoi(fieldIdString);

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

【讨论】:

    猜你喜欢
    • 2021-10-10
    • 2020-04-10
    • 2011-08-30
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多