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

Moa*_*sry -2 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
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*ley 11

printf("mac=%s\n", macs[i]);   //prints garbage
Run Code Online (Sandbox Code Playgroud)

因为macs[i]是类型std::string,并且printf不知道如何处理它.试试这个:

printf("mac=%s\n", macs[i].c_str());
Run Code Online (Sandbox Code Playgroud)

或这个:

std::cout << "mac=" << macs[i] << '\n';
Run Code Online (Sandbox Code Playgroud)

类型安全,FTW


jua*_*nza 6

你正在返回一个字符串:

 return s;
Run Code Online (Sandbox Code Playgroud)

你需要返回向量:

return macs;
Run Code Online (Sandbox Code Playgroud)

编辑后编辑,问题的可能原因是误用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";
}
Run Code Online (Sandbox Code Playgroud)

或者,在C++ 11中,

for (const auto& s : macs) {
  std::cout << s << "\n";
}
Run Code Online (Sandbox Code Playgroud)

  • 我将在这里走出去,说这不是他的(失败的)代码. (2认同)