-2

今日、ウィンドウの下でピースコードの奇妙な動作がありました

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アドレスは正しく出力されていますが、主にガベージを出力します。これは、マックベクトルがガベージ文字列でいっぱいであるという唯一の説明ですが、どうすればよいでしょうか。string.append(const char *)の呼び出しは、参照によって渡されますが、push_back()関数はstringのコピーコンストラクターを呼び出す必要があるため、離れた後にガベージになる文字列参照をこれ以上指し示すべきではありません。スコープでしょ?

4

2 に答える 2

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

于 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 に答える