2009-06-14 3 views

ответ

29

Самый простой подход заключается в использовании функции atoi() найденную в stdlib.h:

CString s = "123"; 
int x = atoi(s); 

Однако, это не очень хорошо иметь дело со случаем, когда строка не содержит действительное число, в этом случае вы должны расследовать strtol() функция:

CString s = "12zzz"; // bad integer 
char * p; 
int x = strtol (s, & p, 10); 
if (* p != 0) { 
    // s does not contain an integer 
} 
+4

споткнулся здесь, потому что компилятор говорит: «atoi: невозможно преобразовать CString в const char *"; то я обнаружил, что ваш ответ не работает, если он является проектом юникода, _ttoi лучше, как указано Unagi – Zac

+0

ошибка C2664: 'atoi': не может преобразовать параметр 1 из 'CString' в 'const char *' – maamaa

14
CString s; 
int i; 
i = _wtoi(s); // if you use wide charater formats 
i = _atoi(s); // otherwise 
+1

Вам нужно сделать что-то с возвращаемыми значениями этих функций для этого кода. – 2009-06-14 14:09:41

+0

Да, вы, конечно, правы. – PaV

7

вы также можете использовать старый добрый sscanf.

CString s; 
int i; 
int j = _stscanf(s, _T("%d"), &i); 
if (j != 1) 
{ 
    // tranfer didn't work 
} 
33

Если вы используете TCHAR.H рутины (неявно или явно), убедитесь, что вы используете _ttoi() функцию, так что он компилирует для обоего Unicode и ANSI сборников.

Подробнее: https://msdn.microsoft.com/en-us/library/yd5xkb5c.aspx

-2

Вы можете использовать функцию C atoi (в предложении Try/поймать, потому что преобразование не всегда возможно) Но нет ничего в классах MFC, чтобы сделать это лучше.

+0

Добро пожаловать в stackoverflow. Возможно, вы правы, но похоже, что это было упомянуто еще в 2009 году (http://stackoverflow.com/a/992775/104223). (Когда у вас есть достаточная репутация, вы можете добавлять комментарии к существующим ответам) – Leigh

+3

atoi не создает исключений –

2

Проблема с принятым ответом заключается в том, что он не может сигнализировать о сбое. Есть strtol (STRING TO Long), который может. Это часть более крупного семейства: wcstol (Широкая символьная строка до длинного, например, Юникод), strtoull (К Unsigned Long Long, 64 бит +), wcstoull, strtof (TO Float) и wcstof.

6

A _ttoi функция может преобразовывать CString в целое число, как широкий char, так и ansi char может работать. Ниже детали:

CString str = _T("123"); 
int i = _ttoi(str); 
0

Определить в MSDN: https://msdn.microsoft.com/en-us/library/yd5xkb5c.aspx

int atoi(
    const char *str 
); 
int _wtoi(
    const wchar_t *str 
); 
int _atoi_l(
    const char *str, 
    _locale_t locale 
); 
int _wtoi_l(
    const wchar_t *str, 
    _locale_t locale 
); 

CString является wchar_t строка. Итак, если вы хотите преобразовать CString в целое, вы можете использовать:

CString s; 
int test = _wtoi(s) 
+0

'CString' зависит от символов препроцессора' _UNICODE' и '_MBCS'. Он может хранить кодировку Unicode, кодированную UTF-16, строку символов DBCS или строку ASCII. Предположение, что всегда будет строкой Unicode, просто неправильно, извините. – IInspectable

0

каноническое решение использовать ++ Standard Library C для преобразования. В зависимости от желаемого типа возврата доступны следующие функции преобразования: std::stoi, std::stol, or std::stoll (или их неподписанные аналоги std::stoul, std::stoull).

Реализация довольно прямо вперед:

int ToInt(const CString& str) { 
    return std::stoi({ str.GetString(), static_cast<size_t>(str.GetLength()) }); 
} 

long ToLong(const CString& str) { 
    return std::stol({ str.GetString(), static_cast<size_t>(str.GetLength()) }); 
} 

long long ToLongLong(const CString& str) { 
    return std::stoll({ str.GetString(), static_cast<size_t>(str.GetLength()) }); 
} 

unsigned long ToULong(const CString& str) { 
    return std::stoul({ str.GetString(), static_cast<size_t>(str.GetLength()) }); 
} 

unsigned long long ToULongLong(const CString& str) { 
    return std::stoull({ str.GetString(), static_cast<size_t>(str.GetLength()) }); 
} 

Все из этих реализаций сообщать об ошибках через исключение (std::invalid_argument, если преобразование не может быть выполнено, std::out_of_range если преобразованное значение будет выпадать из диапазона типа результата). Построение временного std::[w]string также может быть брошено.

Реализации могут использоваться как для Unicode, так и для проектов MBCS.

1
CString s="143"; 
int x=atoi(s); 

или

CString s=_T("143"); 
int x=_toti(s); 

atoi будет работать, если вы хотите конвертировать CString в int.

Смежные вопросы