2010-11-25 23 views
2

J'utilise un code tiers qui a sa propre implémentation pour l'opérateur std :: ostream < <, pour gérer le type de tiers. J'utilise stringstream pour cette sortie - comme:Supprimer les NULL de std :: string

string ToString(const thrdPartyType& structure) 
{ 
stringstream outputStream; 
outputStream<<structure; 
return outputStream.str(); 
} 
... 
string str = ToString(structure); 
... 

Cette structure contient des membres de pointeur, qui sont des valeurs nulles. Lorsque vous utilisez l'opérateur < < et l'affectation de str() dans une chaîne, je vois (via gdb - print str) qu'il y a beaucoup de caractères '\ 000' en tête, puis les données de chaîne dont j'ai besoin.

Comment puis-je découper ces valeurs NULL pour obtenir uniquement les données réelles et non vides?

P.S. Le code exact fonctionne très bien dans Windows VC++ ...

Merci.

+1

On dirait que le code tiers est cassé. Peut-être que vous devriez déposer un rapport de bogue. –

+0

Premièrement, outputStream est-il imprimable? Sur quelle plateforme utilisez-vous gdb? Si c'est l'impression des pointeurs sont-ils 64-bit où il ne fonctionne pas, ce qui peut expliquer pourquoi vous voyez plus de caractères zéro? – CashCow

Répondre

2

Êtes-vous à la recherche d'un workoround comme celui-ci?

string ToString(const thrdPartyType& structure) 
{ 
    stringstream outputStream; 
    outputStream << structure; 

    stringstream workaround; 
    while(! outputStream.eof) { 
    char t; 
    outputStream >> t; 
    if(t != '\0') 
    workaround << t; 
    } 

    return workaround .str(); 
} 
+0

Merci! Juste une petite amélioration - définissez char t en dehors de la boucle. – rkellerm

1

Si vous avez boost disponible, quelque chose comme cela devrait remplacer toutes les occurrences de null dans une chaîne avec une autre valeur.

boost::replace_all(str,boost::as_array(""),"NULL"); 

Par exemple

char buf[10] = "hello"; 
string str(buf,buf+10); 
boost::replace_all(str,boost::as_array(""),"NULL"); 
cout << str << endl; 

produit la sortie suivante

helloNULLNULLNULLNULLNULL