C++ to_string函数根据额外打印语句的先见之明,为浮点数和整数转换提供不同的结果
C++ to_string function giving different results for float and int conversion depending on the prescence of an extra print statement
我需要将所有原始数据类型转换为 char* 形式,我正在尝试使用 char* 函数to_string来做到这一点,但是当 char * 数组传递给不同的函数时,两种数字数据类型(int 和 float)输出相同的值。
这是相关代码:
#include <iostream>
#include <string>
#include "pythonInvoker.h"
using namespace std;
int main(){
char * types = "sif";
const char * strin = "Hello World!";
int num = 2851791;
float point = 75.123123;
const char* argv[] = {"", "multiply", "multiply", strin, (std::to_string(num)).c_str(), (std::to_string(point)).c_str()};
int argc = sizeof(argv) / sizeof(char *);
PyObject* pyObject = invokeFunc(argc, types, argv);
return 0;
}
发送到 invokeFunc 的数组是:
multiply multiply Hello World! 75.123123 75.123123
但是当我在调用 invokeFunc 调用之前添加此行时,数组会发生变化:该行:
cout<<(std::to_string(num)).c_str()<<endl;
输出:
multiply multiply Hello World! 2851791 2851791
发生了什么事情?
表达式
std::to_string(num))
返回一个临时对象,std::to_string(num)).c_str()
是这个临时对象内的指针。临时对象"存在"的时间与使用它的语句一样长。因此,在const char* argv[] = {"", "multiply", strin, std::to_string(num).c_str(),...
之后,它超出了范围并"死亡",然后再在后面的语句中将其传递给函数。然后,访问存储在 argv
中的指针的结果是未定义的行为,您正在观察其中之一。
如果将std::to_string(num)
的结果存储在局部变量中,该变量的生存期超过了后续的函数调用,则它应该可以工作:
std::string numStr = std::to_string(num);
const char* argv[] = {"", "multiply", "multiply", strin, numStr.c_str(), ...}
....
PyObject* pyObject = invokeFunc(argc, types, argv);
相关文章:
- 努力将整数转换为链表。不知道我在这里做错了什么
- 如何在C++中将整数转换为其数字数组
- 如果整数与指针大小相同,则重新解释将整数转换为指针双射是否具有双射作用?
- 将最小值整数转换为无符号长整型
- 为什么我们不能将使用异或运算找到的整数转换为字符?
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 将74位整数转换为以31为底的整数
- 独立于实现的浮点/整数转换
- 以最少的步骤将给定整数转换为另一个整数
- 浮点到整数转换出错(即使浮点数已经是整数)
- 了解双精度转换与整数转换中的整数与截断关系
- 禁止具有精度损失的整数转换
- 将任意整数转换为 void*
- 将 32 位大端有符号整数转换为有符号小端整数
- char a[0] 使用 itoa() 将整数转换为字符串的目的
- 使用函数时从整数转换为字符串
- 尝试从整数转换为字符串的月份
- 如何在C++中将整数转换为字节,以便 Unity 在通过 UDP 传输后能够理解它们
- 如何将 Q 格式的整数转换为浮点数(反之亦然)
- 如何避免字符串到整数转换情况下的无效参数异常