-2

我今天在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向量充满了垃圾字符串,但怎么会发生这种情况;对 string.append(const char*) 的调用,虽然通过引用传递,但 push_back() 函数应该调用 string 的复制构造函数,因此它不应该再指向一个在离开后会变成垃圾的字符串引用范围,对吧?

4

2 回答 2

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

因为macs[i]是 type std::stringprintf不知道如何处理。尝试这个:

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

或这个:

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

类型安全,FTW

于 2012-11-12T22:36:42.037 回答
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";
}
于 2012-11-12T22:30:55.737 回答