2011-01-26 17 views
7

Potrzebuję funkcji C, która zwraca końcową długość sformatowanego ciągu, aby poprawnie przydzielić docelowy ciąg, a nie samemu obliczyć długość. Jest snprintf, który robi to właśnie na niemożność napisania całego ciągu znaków, ale niestety nie ma dla niego żadnej alternatywy.Czy istnieje wersja wchar_t dla asprintf?

swprintf zwraca -1 w przypadku błędu, nie potrzebna długość (dlaczego nie to samo zachowanie?!?)

Tytuł wspomniano asprintf wydaje się być nie pomaga również, gdyż zapewnia non-wide tylko wersja.

_vscwprintf może być używany w oknach, ale potrzebuję platformy krzyżowej, wersji standardowej lub przynajmniej wersji Linuksa, a ja #odkryję kod.

Wszelkie pomysły? Dzięki!

Odpowiedz

3

POSIX 2008 dodał funkcję open_wmemstream, która wraz z vfwprintf spełnia dokładnie to, czego potrzebujesz. Było to dawniej rozszerzenie GNU, więc było dostępne w systemach GNU przez długi czas.

ten może być łatwo wykorzystane do skonstruowania awprintf owijki.

+1

Wielkie dzięki. Ten hack jest fajny i działa. Ciągle nie rozumiem, dlaczego rzeczy tak proste, jak 'awprintf', nie stają się standardem po dodaniu bardziej skomplikowanych funkcji. – gheorghe1800

+0

Prawdopodobnie dlatego, że standardem jest POSIX i prawie nikt nie kodujący systemów POSIX używa 'wchar_t' z wyjątkiem sytuacji, gdy muszą ... –

2

Cóż, wydaje się, że istnieje zasadnicza wada twoich oczekiwań. Dodanie tych up:

  1. Windows ma co chcesz
  2. Linux ma zakaz szeroki wariant (asprintf nie ma żadnego standardu, ale czysto rozszerzeniem GNU Linux i * BSD).
  3. POSIX definiuje wszystko ciąg/plik związany jako nul char* tablicy, co tłumaczy brak szerokich wersji prawie dowolnej funkcji POSIX.
  4. Poza 2, 3 i 4 wszystkie nowoczesne dystrybucje Linuksa są oparte na UTF-8, co oznacza, że ​​nie szerokie wersje są "przeznaczone do użycia".

Dodanie tych daje: dlaczego potrzebujesz czegoś takiego? Z pewnością nie używasz wchar_t s na Unixie, jesteś ;). Jeśli tak, to są jeszcze dwie opcje: przełącz się na rozwiązanie typu tchar (zależne od platformy typedef) lub całkowicie przełącz się na UTF-8.

+0

Dzięki za odpowiedź. Tak, muszę użyć wchar_t i przejście na UTF-8 może być zbyt czasochłonne. – gheorghe1800

+0

@ gheorghe1800: złap wchar_t i użyj [UTF-8] (http://utf8everywhere.org/). Gdybyś to zrobił, to pytanie nie powstałoby. – ybungalobill

3

Tak, swprintf. Należy pamiętać, że pomimo swojej nazwy, swprintf jest odpowiednikiem szeroki charakter snprintf, niesprintf, że to zajmuje rozmiar bufora jako swój drugi parametr; istnieje (na szczęście) wersja bez znaków szerokich, która nie przyjmuje rozmiaru bufora.

Ponadto, ponieważ zwraca -1 w przypadku przepełnienia, będziesz musiał uzyskać łącznej długości łańcucha w jakiś inny sposób. Jedynym naprawdę przenośnym sposobem na zrobienie tego jest rozpoczynanie od bufora o pewnym rozmiarze, wypróbowanie formatowania i sprawdzenie, czy jest wystarczająco duży, a jeśli nie, zwiększ rozmiar i formatuj go, aż będzie wystarczająco duży. To nie jest zbyt skuteczne, jak możesz sobie wyobrazić.

+0

Dzięki. Właśnie o tym myślałem, po prostu miałem nadzieję, że istnieje już lepsze rozwiązanie.Na koniec, myślę, że będę musiał sam obliczyć długość, co wydaje się być podatne na błędy w ogólnym przypadku, ale dopilnuję, aby był dokładny. – gheorghe1800

+0

Istnieje lepszy sposób; zobacz moją odpowiedź. Możesz powrócić do rozwiązania Adama dla systemów sprzed POSIX-2008. –

Powiązane problemy