我今天在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
你正在返回一个字符串:
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)