Fprintf对函数返回的字符有问题
fprintf has problems with characters returned by a function
我有两个问题。这两者都可以用下面的简单代码来说明(用c++ -Wall -O2 -std=c++14编译):
#include <string>
using namespace std;
const char *printi(const unsigned long &i) {
return to_string(i)).c_str();
}
int main() {
unsigned long i1 = 1; unsigned long i2 = 2;
fprintf(stderr, "%s%sn", printi(i1), printi(i2));
}
没有问题。1 -打印"11",而应该打印"12"。
没有问题。2 -有时它根本不打印数字,而是打印一些奇怪的字符。
注意,std::to_string()
返回一个std::string
。这个std::string
只存在于printi()
函数作用域中,这意味着当你退出这个函数时(当你执行return
时),这个std::string
的析构函数被调用,你返回的地址(由c_str()
返回的值)不再指向有效的内存。你的代码有未定义的行为,因为你不知道它现在指向哪个数据。
为了解决这个问题,您可以让printi()
返回一个std::string
,它将被深度复制到return
的调用者中,然后调用者可以根据需要使用c_str()
:
#include <string>
using namespace std;
string printi(const unsigned long &i) {
return to_string(i);
}
int main() {
unsigned long i1 = 1; unsigned long i2 = 2;
fprintf(stderr, "%s%sn", printi(i1).c_str(), printi(i2).c_str());
}
相关文章:
- 我似乎对if/else的基本语句有问题:/
- 我在范围内未声明的错误类有问题
- 我的C++语言蛮力算法有问题
- 我关于函数"Assert"的C++代码有问题
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- C++类中的友元函数有问题?
- 我对数组即 0x6dfe78 有问题
- 我对 std::unique(算法)C++有问题
- 使用 fstream 库并在屏幕上打印的文件有问题?
- 这个模板为什么有问题?如何正确编译
- 尝试使用 indexOf 创建一个 if 语句来检查字符串是否包含字符.有一点麻烦
- 我对 MyGraph 属性顶点名称和边权重有问题
- delete[]有问题,如何部分删除内存
- 在C++中使用exit()退出程序有问题吗
- 跳转到if(false)块有问题吗
- 查找有问题的宏
- 使用 rand() 和 srand() 有问题
- C++ 回文程序总是给出 0(假)作为输出问题;我的代码哪里有问题?
- 我的编辑距离递归代码中的字符类型有问题
- Fprintf对函数返回的字符有问题