2012-11-12 1 views
-2

J'ai eu un comportement bizarre d'un code de pièce aujourd'hui sous windowsretour std :: vecteur <std::string> retourne ordures

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 
    } 
} 

bien que l'adresse MAC dans la fonction a été correctement imprimé, dans la principale, il imprime des déchets, la seule explication que j'ai, que le vecteur macs est plein de chaînes de déchets, mais comment cela peut-il arriver; un appel à string.append (const char *), bien qu'il passe par référence, la fonction push_back() devrait appeler le constructeur de la chaîne de copie, et ne devrait donc plus pointer vers une référence de chaîne qui deviendra une poubelle après avoir quitté le portée, non?

+3

Je suppose que vous êtes macs ing "retour"? pas s? –

+3

Veuillez poster un code réel, compilable. – jrok

+2

Ce code ne peut pas être votre code actuel. S'il vous plaît fournir un exemple compilable. –

Répondre

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

Parce que macs[i] est de type std::string et printf qui ne fonctionne pas savoir comment gérer cela. Essayez ceci:

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

Ou ceci:

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

sécurité Type, FTW

+0

bien sûr comment pourrais-je raté cela, merci beaucoup –

6

Vous retournez une chaîne:

return s; 

vous devez retourner le vecteur:

return macs; 

Modifier après votre édition, la cause probable de votre problème est une mauvaise utilisation de printf. Vous pouvez parcourir le vecteur et d'imprimer le contenu comme ceci:

std::vector<std::string> macs = getMACs(); 
for (std::vector<std::string>::const_iterator it = macs.begin(); it != mac.end(); ++it) { 
    std::cout << *it << "\n"; 
} 

ou, en C++ 11,

for (const auto& s : macs) { 
    std::cout << s << "\n"; 
} 
+2

Je vais sortir d'ici et dire que ce n'est pas vraiment son code (à défaut). – moswald

+0

@moswald à ce moment dans le temps, cela semble extrêmement probable! – juanchopanza

+0

son plus probablement parce que je passe à printf le paramètre s au lieu de s.c_str, je vais l'essayer le matin, merci pour la réponse –

Questions connexes