Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

1

15.04.2006, 13:54

Komisches Verhalten der Funktion ::swscanf_s()

Wie der Titel schon sagt, verhaltet sich besagte Funktion komisch:

Ich habe einen String der sieht bspw so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
//Mein String: pwcParam = L"int iTest";


//nun mach ich einen scan:

wchar_t     awcType[8];
wchar_t     awcName[64];
memset(awcType, 0, sizeof(awcType));
memset(awcName, 0, sizeof(awcName));
::swscanf_s(pwcParam, L"%s %s", awcType, sizeof(awcType), awcName, sizeof(awcName));


Müsste ja rein theoretisch stimmen: Erwartete Werte wären ja jetzt:
awcType == L"int"
awcName == L"iTest"

Nur leider stimmt das nicht!
Ich bekomm zwar awcName == L"iTest" doch in awcType steht alles andere als L"int" drin.... Da sind massenweise "Hyroglyphen" drin: "﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌"

Was könnte da das Problem sein?
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Anonymous

unregistriert

2

15.04.2006, 15:51

Black-Panther
Bei memset musst Du *2 rechnen, so rechnest Du nur in Einerbytes nicht in Doppelbytes (Geile Wörter :D)

Dazu kannst Du Dir diese Zeilen auch ersparen:

C-/C++-Quelltext

1
wchar_t buffer[256] = L"";
Vorallem, da diese auch keine Escapesequenzen setzen.

Für Tastatureingaben empfehle ich:

C-/C++-Quelltext

1
std::wcin.get (buffer, 256]);


Dazu stellt sich die Frage: Wie gibst Du überhaupt Deine Informationen aus?

3

15.04.2006, 19:01

Ein Tipp, sofern du aus einer Textdatei liest:

Überprüfe, dass sie im UNICODE-Format abgespeichert ist (Notepad), im ANSI/ASCII-Format werden nämlich letztendlich *char's* in deine *wchar_t's* kopiert.

Also "Notepad: Speichern unter -> Unicode -> ...".

Ich hoffe, ich konnte helfen...

F0GX

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

4

15.04.2006, 20:05

Zitat von »"nix da"«

Black-Panther
Bei memset musst Du *2 rechnen, so rechnest Du nur in Einerbytes nicht in Doppelbytes (Geile Wörter :D)


Da irrst du dich, wenn ich sizeof(awcType) mache, bekomm ich nicht 8 sondern 16! Also NIX * 2!

Zitat von »"nix da"«


Dazu kannst Du Dir diese Zeilen auch ersparen:

C-/C++-Quelltext

1
wchar_t buffer[256] = L"";
Vorallem, da diese auch keine Escapesequenzen setzen.

Danke!

Zitat von »"nix da"«


Für Tastatureingaben empfehle ich:

C-/C++-Quelltext

1
std::wcin.get (buffer, 256]);


Dazu stellt sich die Frage: Wie gibst Du überhaupt Deine Informationen aus?

Also 1. handelt es sie bei pwcParam nicht um Tastatureingaben und 2. ist dies keine Konsolenanwendung!

Also zur Erklärung:
Es handelt sie hierbei um einen Auszug von einem Skriptinterpreter, welcher aus einer Datei (char!) den Code auslest, diesesn Umwandelt in wchar_t und ihn speichert. Danach wird eine Zeile ausgelesen, und in Command und Parameter gesplittet. pwcParam ist nichts anderes, als die Parameter eines Befehls, und in diesem Fall ist der Befehl "New", demnach, das erstellen einer Variable, nun benötige ich den Typ der Variable in einem und den Namen in einer Anderen Variable! --> awcType und awcName!
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

5

16.04.2006, 23:35

Weiß hier keiner eine Lösung? (ich will nicht auf die unsecure-Function zurückgreifen müssen (mit dieser nämlich läufts einwandfrei!!))
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

6

18.04.2006, 00:30

JUHUUUU!!! Hab den Fehler gefunden! Muss wohl Tomaten auf den Augen haben! Mit sizeof(awcType) bekomm ich nicht die Anzahl der ZEICHEN welche Platz haben, sondern die ANZAHL der BYTES!!!
Demnach muss die Zeile so heißen:

C-/C++-Quelltext

1
2
3
4
wchar_t     awcType[8]      = L"";
    wchar_t     awcName[64]     = L"";
    ::swscanf_s(pwcParam, pwcFormat,
                awcType, sizeof(awcType) / sizeof(wchar_t), awcName, sizeof(awcName) / sizeof(wchar_t));
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Werbeanzeige