2011-01-07 4 views
0

Il y a un Binary2String() dans mon projet.Sprintf() erreur

Cela fonctionne bien pendant longtemps. Mais il a levé l'exception quand vec[0] = 255 sur sprintf(temp, "%02d ", vec[i]);.

Code original comme cela,

void Binary2String(const vector<unsigned char>& vec, string& result) 
{ 

if(vec.size() == 0) 
    return; 

for(size_t i = 0; i < vec.size(); i++) 
{ 
    char temp[4] = {0}; 
    sprintf(temp, "%02d ", vec[i]); 
    result.push_back(temp[0]); 
    result.push_back(temp[1]); 
    result.push_back(temp[2]); 

} 
} 

Ensuite, je fixe le bug comme cela, je ne peux pas comprendre le vecteur et sprintf() terminé.

Est-ce logique ou non? (Je suis nouveau à C++. Merci)

 char temp[6] = {0}; 
    sprintf(temp, "%02d ", vec[i]); 
    result.push_back(temp[0]); 
    result.push_back(temp[1]); 
    result.push_back(temp[2]); 
     result.push_back(temp[3]); 
    result.push_back(temp[4]); 

Répondre

4

Tout d'abord, %02d n'est pas le format correct car les valeurs peuvent aller jusqu'à 3 chiffres (%03d serait plus approprié). Et comme Chris indique dans le commentaire ci-dessous, %03hhu serait le spécificateur techniquement correct (pour comprendre %03hhu, jetez un oeil à this cheat sheet). Deuxièmement, vous avez besoin de 5 octets pour stocker les caractères "2", "5", "5", "", 0 (vous avez un espace supplémentaire à la fin de %02d). Déposez l'espace ou étendez le tampon à au moins 5 caractères (comme vous l'avez fait).

Enfin, vous pouvez convertir en chaîne beaucoup plus fiable de cette façon:

template<typename T> std::string ToString(const T& in) { 
    std::basic_ostringstream<char> o; 
    if (!(o << in)) { 
     // error, throw an exception 
    } 
    return o.str(); 
} 
+1

'% 03hhu' serait _most_ approprié, car il est pas un type signé et ce n'est pas' int' taille. –

+0

@Chris: vrai, j'ai mis à jour la réponse. – Jon

+1

Merci pour la feuille de triche. Je voulais quelque chose comme ça depuis des lustres. Je ne savais pas que quelqu'un avait pris le temps de l'écrire. –