我有一个返回std::string
的函数。我将它传递给printf
并创建了一个辅助函数,该函数使用公共参数调用函数并返回std::string
中的c字符串指针。我为每次通话都得到了相同的指针。我认为这与临时生活有关。如果可能的话,我想解决这个问题并使其安全。
#include <stdio.h>
#include <string>
std::string intToString(int num) {
char buf[100];
snprintf(buf, sizeof(buf), "%d", num);
return buf;
}
const char *helper(int num, int increment) {
return intToString((num + increment) * 10).c_str();
}
int main() {
for (int i=1; i < 5; i++) {
printf("- %d: %3s %3s %3s %3s\n", i,
intToString((i + 0) * 10).c_str(),
intToString((i + 1) * 10).c_str(),
intToString((i + 2) * 10).c_str(),
intToString((i + 3) * 10).c_str()
);
printf("+ %d: %3s %3s %3s %3s\n", i,
helper(i, 0),
helper(i, 1),
helper(i, 2),
helper(i, 3)
);
}
return 0;
}
输出:
- 1: 10 20 30 40
+ 1: 10 10 10 10
- 2: 20 30 40 50
+ 2: 20 20 20 20
- 3: 30 40 50 60
+ 3: 30 30 30 30
- 4: 40 50 60 70
+ 4: 40 40 40 40
答案 0 :(得分:4)
c_str()
的返回值仅在字符串对象存在且未被修改时才有效。像在helper
中那样从临时状态返回它是不正确的。请改为std::string
,并仅在实际需要将其用作c字符串的网站上使用c_str()
。
答案 1 :(得分:0)
这是仅使用c ++对象和流的等效代码:
#include <iostream>
#include <string>
#include <iomanip>
std::string helper(int num, int increment) {
return std::to_string((num + increment) * 10);
}
int main() {
for (int i=1; i < 5; i++) {
std::cout << "- " << i
<< ": " << std::setw(3) << std::to_string((i + 0) * 10)
<< " " << std::setw(3) << std::to_string((i + 1) * 10)
<< " " << std::setw(3) << std::to_string((i + 2) * 10)
<< " " << std::setw(3) << std::to_string((i + 3) * 10)
<< '\n';
std::cout << "+ " << i
<< ": " << std::setw(3) << helper(i, 0)
<< " " << std::setw(3) << helper(i, 1)
<< " " << std::setw(3) << helper(i, 2)
<< " " << std::setw(3) << helper(i, 3)
<< '\n';
}
return 0;
}
预期产出:
- 1: 10 20 30 40
+ 1: 10 20 30 40
- 2: 20 30 40 50
+ 2: 20 30 40 50
- 3: 30 40 50 60
+ 3: 30 40 50 60
- 4: 40 50 60 70
+ 4: 40 50 60 70