2017-07-17 5 views
2

Ich weiß, es gibt eine Menge Informationen und Threads über Char-Array zu String-Konvertierung, aber ich habe viele "Lösungen" ohne Erfolg ausprobiert. Ich versuchte dieses solution, das meinem Problem am nächsten ist, aber auch nicht funktionierte.Sonderzeichen auf Char-Array zu String-Konvertierung

Ich habe den folgenden Code:

recvlen = recvfrom(s, recvbuf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen); 
if (recvlen < 0) { 
    printf("socket() failed with error code : %d", WSAGetLastError()); 
} 

string msgrcv(recvbuf, recvlen); 
printf("String : %s \n", msgrcv); //Prints the weird characters 
printf("Array : %s \n", recvbuf); //Prints ok the result 

Irgendwelche Ideen, was ich bin fehlt oder falsch ist?

+0

@joe Bitte fügen Sie Ihre Ausgabe hinzu. –

+0

In diesem Fall -> 'printf' kann nicht mit der C++ - Zeichenfolge umgehen. – Ron

+0

es ist C++, ich habe "using namespace std;" Oben auf dem Code wird der Code kompiliert und funktioniert. – joe

Antwort

3

Ihre seltsamen Zeichen, die gedruckt werden, sind ein Ergebnis von undefiniertem Verhalten.

printf("String : %s \n", msgrcv); 

Die %s Formatbezeich erwartet, ein Zeiger auf einen nul terminierte Zeichenfeld (C-string). Sie übergeben eine std::string (vorausgesetzt, eine böse using namespace std; irgendwo).

Um Datentyp Formatbezeich entsprechen, verwenden std::string::c_str:

printf("String : %s \n", msgrcv.c_str()); 
1

Die printf Formatbezeich %s erfordert, dass das Argument einen Zeiger sein muss (char*) zu einem null-terminierte Character-Array. Sie haben keine char*, sondern eine string übergeben.

Wenn string zufälligerweise std::string ist, dann können Sie einen Zeiger auf die mit Null abgeschlossene Zeichenkette unter Verwendung der c_str Elementfunktion erhalten. Oder Sie könnten einen Stream verwenden:

std::cout << "String : " << msgrcv << '\n';