多个std :: string temporaries导致相同的c_str指针

时间:2017-09-19 19:45:05

标签: c++ stdstring temporary

我有一个返回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

2 个答案:

答案 0 :(得分:4)

c_str()的返回值仅在字符串对象存在且未被修改时才有效。像在helper中那样从临时状态返回它是不正确的。请改为std::string,并仅在实际需要将其用作c字符串的网站上使用c_str()

供参考:http://www.cplusplus.com/reference/string/string/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