Forum: PC-Programmierung Visual Studio Win32: Probleme mit printf


von vs_entwickler (Gast)


Lesenswert?

Guten Morgen,

folgendes Problem habe ich mit der Funktion printf in einer Win32 
Konsolenanwendung. Von einer Kommunikationsschnittstelle werden Daten 
empfangen. Es handelt sich um mehrere char Zeichen, die in einen Buffer 
vom Type char abgelegt werden. Diese Zeichen werden mit der Funktion 
printf nicht dargestellt. Woran könnte dies liegen?
1
char Buffer[256];
2
3
printf("Message number: %2i Length = %i  Data = %s\n", i++,Len,Buffer);

von Fred (Gast)


Lesenswert?

Daß es non-printable characters sind, vermutlich.

von vs_entwickler (Gast)


Lesenswert?

Wahrscheinlich muss noch in Visual Studio was eingestellt werden.
Das sind Zeichen, die dargestellt werden können.

von Peter II (Gast)


Lesenswert?

lass dir doch mal als Hex anzeigen was wirklich in Buffer steht.
1
printf("Buffer:");
2
for( int i = 0; i < 256; ++i ) {
3
   printf( "%2x ", buffer[i] );
4
}
5
printf("\n");

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

vs_entwickler schrieb:
> Wahrscheinlich muss noch in Visual Studio was eingestellt werden.

Nein.

vs_entwickler schrieb:
> Das sind Zeichen, die dargestellt werden können.

Alle? Von Anfang an?
Lass Dir doch im Debugger mal einen Hexdump des Arrayinhalts ausgeben 
und poste den hier.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Was genau wird denn (nicht) angezeigt?

Wird denn wenigstens alles bis zum "Data =" ausgegeben?

Wenn ja, werden für die Message Number und die Length die richtigen
Zahlenwerte ausgegeben?

Was wird nach "Data =" abgezeigt? Gar nichts oder falsche Zeichen?

Von welchem Typ sind i und len?

Zwar für das konkrete Problem nicht relevant, aber trotzdem wichtig: Ist
Buffer nullterminiert?

von vs_entwickler (Gast)


Lesenswert?

Hier ein Ausschnitt von der Applikation:
1
int i = 0;
2
char Buffer[256];
3
4
5
void Receive(void)
6
{
7
  int Len;
8
         Len = UDP->Receive(&UDP,Buffer, 256,0);
9
  if(Len)
10
  {
11
    printf("Message number: %2i Length = %i  Data = %s\n", i++,Len,Buffer);
12
  }
13
}

von vs_entwickler (Gast)


Lesenswert?

Mit Wireshark sehe ich die Daten.

Daten:

0x08
0x00
0x44
0x50
0x20
0x43

von Fred (Gast)


Lesenswert?

vs_entwickler schrieb:
> Hier ein Ausschnitt von der Applikation:

Interessiert niemanden.

Was steht wirklich im Puffer?

von Fred (Gast)


Lesenswert?

vs_entwickler schrieb:
> Mit Wireshark sehe ich die Daten.

Was steht im Puffer?

Nicht im Telegramm auf der Strippe.

von Peter II (Gast)


Lesenswert?

vs_entwickler schrieb:
> 0x08
> 0x00

wenn das wirklich im Buffer steht, ist doch auch klar warum es nicht 
ausgegeben wird. 8 ist nicht darstellbar (oder überschreibt sogar das 
letzte zeichen) und 0 beendet den String.

von Dumdi D. (dumdidum)


Lesenswert?

Ohne mir die Funktion gefunden zu haben, aber ist denn überhaupt klar,
UDP->Receive(&UDP,Buffer, 256,0);
ob die Daten schon angekommen sind? Wartet diese Funktion?
Aus welcher LIB ist die?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Ich glaube, wir brauchen hier gar nicht weiter zu rätseln.

vs_entwickler hat die Eingangsdaten genannt

> 0x08
> 0x00
> 0x44
> 0x50
> 0x20
> 0x43

und Peter II hat ihm erklärt, warum sie nicht (sichtbar) ausgegeben
werden.

Da sollten eigentlich keine Fragen mehr offen sein :)

Um jetzt doch noch etwas zu rätseln: Ich schätze, dass die ersten beiden
Byte (0x08 und 0x00) die Länge und/oder den Nachrichtentyp enthalten. Um
nur den reinen Text auszugeben, sollte man vielleicht erst bei Byte 2
beginnen, also etwa so:
1
    printf("Message number: %2i Length = %i  Data = %s\n", i++,Len,Buffer+2);

Dabei muss aber sichergestellt werden, dass am Ende des Texts in Buffer
ein String-Ende-NUL-Zeichen steht. Ich kann mir nicht vorstellen, dass
UDP->Receive dieses von sich aus anhängt.

Aber wie gesagt, auch das ist alles nur gerätselt.

: Bearbeitet durch Moderator
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.