【发布时间】:2017-03-01 16:18:19
【问题描述】:
我有两个问题。两者都可以用这个简单的代码来说明(用 g++ -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%s\n", printi(i1), printi(i2));
}
问题编号。 1 - 它打印“11”,而它应该打印“12”。
问题编号。 2 - 有时它根本不打印数字,而是打印一些奇怪的字符。
【问题讨论】:
-
有趣的是,当我运行此代码时,我得到 22 作为输出。为什么要打印到
stderr而不是stdout? -
您返回的是一个临时 = 坏消息。
-
如果我不能使用函数返回的值,我该如何工作? :( 我需要将该字符串放入 fprintf ... (整个代码只是对更大的东西的抽象,这应该是调试信息,这就是它是 stderr 的原因)
-
@Jecke:你在写 C 还是 C++?使用
std::string,如果你正在编写C++,使用std::cerr -
我用 C++ 编写,但我使用 fprintf 因为它更方便。我可以使用
fprintf("blah %s blah %lu blah %s\n", a, b, c)而不是cerr << "blah" << a << "blah" << b << "blah" << c << endl;... 它更短更灵活。事实上,我一开始就有#define debug_out( ... ) if (debug) fprintf(stderr, __VA_ARGS__ ),我不必担心要打印多少不同的参数,而且它更干净