2016-03-21 7 views
1

Ich möchte Zahlen in einem std::vector<unsigned char> auf einem Bildschirm anzeigen, aber auf dem Weg zum Empfänger muss ich stopfen Sie diese Zahlen in eine std::string.Konvertieren von Vektor <unsigned char> {1,2,3} in Zeichenfolge "1-2-3" AS DIGITS

Was auch immer ich versuchte (atoi, reinterpret_cast, string.c_str() ...), gab mir entweder einen Unsinn, oder eine Buchstaben-Darstellung dieser ursprünglichen Nummern - d. H. Ihre entsprechenden ASCII-Zeichen.

Also wie kann ich einfach (vorzugsweise Standardmethode) vector<unsigned char> {1,2,3} in eine string "1-2-3" konvertieren?

In der Original Post (später bearbeitet) erwähnte ich, dass ich das in C# oder Java machen könnte. Auf Antrag von πάντα ῥεῖ Beispiel in C# oder Java, hier zu schaffen, ist ein schneller # Weg Linq C:

public static string GetStringFromListNumData<T>(List<T> lNumData) 
    { 
     // if (typeof(T) != typeof(IConvertible)) throw new ArgumentException("Expecting only types that implement IConvertible !"); 
     string myString = ""; 
     lNumData.ForEach(x => myString += x + "-"); 
     return myString.TrimEnd('-'); 
    } 
+1

'1' und' 1'' sind nicht dasselbe. – NathanOliver

+0

Wie hätten Sie das auf einfache Weise mit C# oder Java gemacht? –

+0

@ πάντα ῥεῖ Ich habe gerade ein C# -Beispiel gepostet, sicherlich ein Thema möglicher Verbesserungen :) –

Antwort

2

Einfach ein verwenden std::ostringstream:

std::vector<unsigned char> v{1,2,3}; 
std::ostringstream oss; 
bool first = true; 
for(auto x : v) { 
    if(!first) oss << '-'; 
    else first = false; 
    oss << (unsigned int)x; 
} 
std::cout << oss.str() << std::endl; 
+0

Das OP hat einen 'Vektor ' nicht ein 'Vektor '. – NathanOliver

+0

@NathanOliver THX zum Hinweisen, behoben. –

+0

Absolut brillante Antwort! Hier ist, wie ich lerne C++ 11/14 Vielen Dank! –

3

Hier ist, wie ich damit umgehen:

std::vector<unsigned char> v {1, 2, 3}; 

std::string s; // result 

auto sep = ""; // continuation separator 
for(auto n: v) 
{ 
    s += sep + std::to_string(n); 
    sep = "-"; // change the continuation separator after first element 
} 

std::cout << s << '\n'; 

Der Fortsetzungs Separator beginnt leer und wird nach dem Verketten des ersten outpu geändert t.

Ausgang:

1-2-3 
+0

Eine weitere ausgezeichnete Antwort - Danke für die nette Inspiration .. –

2

Noch ein anderes Beispiel:

std::vector<unsigned char> v{1,2,3}; 

std::ostringstream str; 
std::transform(v.begin(), v.end(), std::ostream_iterator<char>(str, "-"), [](unsigned char c){ return '0' + c;}); 

std::cout << str.str(); 

[Bearbeiten]

leider über zusätzliches Hinter - Symbol hinzufügen, um es zu verhindern - komplizierter Code ist notwendig:

std::transform(v.begin(), v.end(), std::ostream_iterator<std::string>(str), [&](auto c){ 
    return (str.rdbuf()->in_avail() ? "-" : "") + std::to_string(c); 
}); 
Verwandte Themen