return std :: vector <std :: string>返回垃圾</std :: string>

时间:2012-11-12 22:29:30

标签: c++ string

今天我在Windows下有一个奇怪的代码行为

std::vector<std::string> getMACs() {
  std::vector<std::string> macs;
  for(/*something*/) {
    char buffer[100];
    sprintf_s(buffer, size, "get the mac address here");
    std::string s = "";
    s.append(buffer);
    printf("mac=%s\n", s.c_str();  //print the mac address correctly
    macs.push_back(s);
  }
  return macs;
}

int main(int, char**) {
  std::vector<std::string> macs = getMACs();
  for (size_t i = 0; i < mac.size(); i++) {
    printf("mac=%s\n", macs[i]);   //prints garbage
  }
}

尽管函数内部的mac地址已经正确打印,但主要是打印垃圾,这是我唯一的解释,macs vector充满了垃圾字符串,但是怎么会发生这种情况呢?调用string.append(const char *),虽然通过引用传递,但push_back()函数应该调用string的复制构造函数,因此它不应该再指向一个字符串引用,它将在离开之后变成垃圾范围,对吗?

2 个答案:

答案 0 :(得分:11)

printf("mac=%s\n", macs[i]);   //prints garbage

因为macs[i]的类型为std::string,而printf不知道如何处理。试试这个:

printf("mac=%s\n", macs[i].c_str());

或者这个:

std::cout << "mac=" << macs[i] << '\n';

类型安全,FTW

答案 1 :(得分:6)

您正在返回一个字符串:

 return s;

你需要返回矢量:

return macs;
编辑后

修改,可能导致问题的原因是printf误用。您可以遍历矢量并打印内容,如下所示:

std::vector<std::string> macs = getMACs();
for (std::vector<std::string>::const_iterator it = macs.begin(); it != mac.end(); ++it) {
  std::cout << *it << "\n";
}

或者,在C ++ 11中,

for (const auto& s : macs) {
  std::cout << s << "\n";
}