今天我在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的复制构造函数,因此它不应该再指向一个字符串引用,它将在离开之后变成垃圾范围,对吗?
答案 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";
}