vsnprintf und gcc
Habe ich die folgende Anweisung:
vsnprintf(target, size - 1, "%ls_%ls", str16_1, str16_2);
Warum wird dies nicht auf gcc?
Habe ich es auf Windows so:
vsnprintf(target, size - 1, "%S_%S", str16_1, str16_2);
und es funktioniert wie erwartet. Auf der gcc-Dokumentation habe ich gefunden, dass "%S " ist synonym mit %ls, aber ich muss es nicht verwenden. Ich habe versucht, auch mit %S, aber nicht funktioniert. Ich benutze diese in eine Funktion mit variabler Argumentliste. Ist es möglich, nicht zu arbeiten, weil ich das format variable, die ich übergeben, um va_start? Ich muss suchen, %S und ersetzen Sie es mit %ls in der format-Variablen.
Die Funktion ist etwas wie:
void f(const char* format, ...){
char* new_format = format with %S replaced with %ls;
va_list argptr;
va_start(args, format);
vsnprintf(str, size-1, new_format, argptr);
}
Habe ich überprüft und new_format korrekt ist.
Danke!
- Felics, für die Zukunft, bitte code einfügen, indem Sie vier Leerzeichen (oder verwenden Sie den
101010
- button über dem editor-Fenster). - "Wissen Sie, warum das scheitert an gcc?" Nein, aber ich könnte es denke ziemlich gut, wenn ich weiß, wie es funktioniert nicht. Tut es nicht kompilieren? Verursacht Abstürze? Tut es unerwartete Ergebnisse?
- Es ergibt unerwartete Ergebnisse(leere Zeichenfolge)
- Also, was sind
str16_1
undstr16_2
, und wo ordnen Sie Ihre Werte? Genau wie werden Sie untersucht die Ausgabe? Warum tun Sie zeigen, dass Sie der übergabe von strings an vsnprintf in Ihren Beispielen, gegeben, dass sollte nicht auch kompilieren? - str16_1 und str16_2 sind ein Beispiel dafür, wie das, was argptr wäre im inneren f () - Funktion, um zu wissen, dass ich mit 16 bit chars.
- Abgesehen von der verwirrenden snprintf mit vsnprintf, Ihr problem ist, dass 16-bit-wchar_t ist ein Fehler nur unter Windows. Sane-Systemen ein 32-bit-wchar_t in der Lage repräsentieren alle Unicode.
- Ersetzen
va_start(args, format);
mitva_start(args, new_format);
und das Programm sollte funktionieren. Auch, hinzufügenva_end(args);
am Ende. Bitte siehe typische vsnprintf Programm finden Sie hier.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie es mit
snprintf
, der Grund dafür istvsnprintf
.vsnprintf
nimmt ein argument vom Typva_list
, nicht eine wörtliche variadic-argument-Liste. Zum Beispiel:In der Erwägung, dass mit sprintf:
Verwenden
v*printf
wenn...Ansonsten verwenden Sie einfach
*printf
Ihre Nutzung der
va_start
ist falsch. In dieser Anweisung:sind Sie nicht in Bezug auf das
format
parameter derf()
Funktion. Das zweite argumentva_start()
muss beziehen sich auf einen parameter in der formalen Parameterliste der Funktion. Alles andere ist wahrscheinlich ein Undefiniertes Verhalten.Verwendet der compiler den Namen der formalen parameter in
va_start()
zu bestimmen, wo zu Beginn der Suche für die variable Liste von Argumenten im Funktionsaufruf. Es muss nicht automatisch wissen, wo Sie...
in der argument-Liste (vielleicht könnte man annehmen, dass es sollte, aber das ist nicht, wie es funktioniert).Schaute ich
%ls
fürvsnprintf
und fand, dass dies der Formatbezeichner für das drucken/formatieren einer Zeichenfolge von wide-Zeichen, d.h.wide_t *p = L"Hello world!";
Es dauerte ein bisschen zu spielen und googeln breites Zeichen verwenden, in C++ (ich mochte die folgende Seite: http://www.linux.com/archive/feed/51836), aber ich denke, ich dachte, Ihr problem.
Wenn Sie eine
char
string%ls
dann hilft es nicht weiter, aber wenn Sie einewchar_t
string%ls
dann druckt.Betrachten Sie das folgende Beispiel-code, den ich anhand Ihrer Informationen:
Den ich kompiliert habe, das mit g++.
Ausgabe unter:
Verwenden
snprintf
.Was ist Ihre
valist
geben? Der richtige Typ für die variable Liste der Argumente istva_list
mit einem Unterstrich, Nein?Weil ich diese auf dem Mac fand ich einen work-around:
Wie "pass auf", die eine variable Anzahl von Argumenten, NSString ' s +stringWithFormat:
Scheint es, dass vsnprintf nicht umgehen kann 16-bit-Zeichenfolge. Vielleicht, weil wchar_t ist nicht 16 bit.