2014-04-19 35 views
9

Zakładam, że jest to bardzo proste, ale nie mogę go uruchomić.Konwersja std :: wstring na int

Po prostu próbuję przekonwertować std :: wstring na int.

Próbowałem do tej pory dwóch metod.

Pierwszym jest użycie "C" metody z "atoi" tak:

int ConvertedInteger = atoi(OrigWString.c_str()); 

Jednak VC++ 2013 mówi mi:

błąd argument typu "const wchar_t *" jest incompatable z parametrem typu "const char_t *"

Więc moja druga metoda była to wykorzystać, za Wyszukiwarka Google:

std::wistringstream win(L"10"); 
      int ConvertedInteger; 
      if (win >> ConvertedInteger && win.eof()) 
      { 
       // The eof ensures all stream was processed and 
       // prevents acccepting "10abc" as valid ints. 
      }  

Jednak VC++ 2013 mówi mi tak:

"Błąd: niekompletne typu niedozwolone."

Co ja tu robię źle?

Czy istnieje lepszy sposób konwersji std :: wstring na int iz powrotem?

Dziękuję za poświęcony czas.

+1

Czy "#include "? Twój kod z stringstreamem powinien działać. – Praetorian

+0

Proszę spróbuj przekonwertować ciąg za pomocą 'int ConvertedInteger = _wtoi (OrigWString);' ... –

+0

Zawsze możesz skonstruować 'std :: string' z łańcucha i użyć' std :: stoi' na tym. Możesz przydzielić alokację pamięci, jeśli ta liczba jest wystarczająco duża, ale wątpię, by była ona gorsza niż używanie strumienia stringów. –

Odpowiedz

25

Nie trzeba powracać do C api (atoi), nie przenośnego API (_wtoi) lub kompleksowego rozwiązania (wstringstream), ponieważ istnieją już proste, standardowe interfejsy API do wykonywania tego rodzaju konwersji: std :: stoi i std :: to_wstring

#include <string> 

std::wstring ws = L"456"; 
int i = std::stoi(ws); // convert to int 
std::wstring ws2 = std::to_wstring(i); // and back to wstring 
+2

Jednym z powodów, dla których należy unikać używania funkcji 'sto *()', jest to, że wszystkie one rzucają wyjątki. 'ato *()' nie –

-2

możesz użyć dostępnego API z wstring.h.

do konwersji WString na int spróbuj int ConvertedInteger = _wtoi(OrigWString);.

do użytku referencyjnego msdn.microsoft.com/en-us/library/aa273408(v=vs.60).aspx.

+0

Co masz na myśli przez * stream zwraca wartości ciągu *? OP [kod działa] (http://coliru.stacked-crooked.com/a/c17228c41560b000), błąd jest gdzie indziej. – Praetorian

+0

@Praetorian Mam na myśli to, że kiedy piszemy/odczytujemy dane do/z obiektu stream, to działa on na wartości łańcuchowe w przypadku OP, to jest wstring –

+0

OP używa 'wistringstream', który zajmuje się' wchar_t's, a nie 'char's. Ponownie jego kod działa, spójrz na link w poprzednim komentarzu. Komunikat o błędzie dotyczący używania niekompletnego typu najprawdopodobniej oznacza, że ​​zapomniał o dołączeniu pliku nagłówkowego. – Praetorian