Получение целочисленного значения char из std :: string & std :: wstring - PullRequest
0 голосов
/ 20 октября 2011

Я пытаюсь преобразовать строку в число, суммируя значение int каждой буквы вместе в C ++ WinAPI. Так в ASCII; std :: string "AA" будет равна 130 (65 + 65)

Строка может быть либо std :: string, либо std :: wstring.

Почему следующая функция всегда возвращает значение ноль, независимо от того, какую букву я в ней поместил? Не должно ли оно вернуть целочисленное значение буквы ASCII или Unicode?

printf("TEST a: %d \n", _tstoi(_T("a")));
printf("TEST A: %d \n", _tstoi(_T("A")));
printf("TEST b: %d \n", _tstoi(_T("b")));

Мое приложение VC ++ в настоящее время находится в Юникоде, и предыдущий код выводит ноль для каждой буквы. Я помню, что слышал, что Unicode сильно отличается от строк ASCII, Можете ли вы выяснить, что именно отличается от Unicode, имеет библиотеку символов, которая имеет длину около 30000, а ASCII 256 (я думаю?)?

Ответы [ 3 ]

3 голосов
/ 20 октября 2011

В статье MSDN говорится:

"Входная строка представляет собой последовательность символов, которые могут быть интерпретированы как числовое значение указанного типа. Функция перестает читать входная строка в первом символе, который не может быть распознан как часть номера. "

Если вы протестируете код со строками Unicode, содержащими действительные числа, вы увидите правильный вывод:

printf("TEST 1: %d \n", _tstoi(_T("1")));

выход: * +1010 *

TEST 1: 1

Как сказал @Ylisar, функции * toi используются вместо преобразования числовых значений из строк в целочисленные переменные.

Следующий код вместо этого выведет числовое представление, но следите за указательным представлением константных переменных. Я оставил обе версии, чтобы вы могли увидеть разницу:

  printf("TEST 1: %d \n", _tstoi(_T("1")));
  printf("TEST a: %d \n", _tstoi(_T("a")));
  WCHAR* b(_T("b"));
  printf("TEST A: %d \n", _T("A"));
  printf("TEST b: %d \n", *b);

Выход:

TEST 1: 1
TEST a: 0
TEST A: 13457492
TEST b: 98

Проверьте больше на http://msdn.microsoft.com/en-us/library/yd5xkb5c%28v=vs.80%29.aspx

Если вы хотите суммировать (накапливать) значения, я бы порекомендовал вам проверить функции диапазона STL, которые творит чудеса в таких вещах. Например

#include <numeric>
#include <string>

printf("TEST a: %d \n", *_T("a")); // 97
printf("TEST b: %d \n", *_T("b")); // 98

wstring uString(_T("ba"));
int result = accumulate(uString.begin(), uString.end(), 0);
printf("TEST accumulated: %d \n", result);

Результаты:

TEST a: 97
TEST b: 98
TEST accumulated: 195

Таким образом, вам не нужно иметь циклы for, проходящие через все значения. Функции диапазона действительно хороши для подобных вещей.

Проверьте больше на: http://www.sgi.com/tech/stl/accumulate.html

1 голос
/ 20 октября 2011

семейство функций * toi преобразует строковое представление в целочисленное представление, то есть «10» становится 10. То, что вы на самом деле хотите сделать, это вообще не преобразовывать. Измените его на:

printf("TEST a: %d \n", _T('a'));
printf("TEST A: %d \n", _T('A'));
printf("TEST b: %d \n", _T('b'));

Что касается юникода, базовое представление зависит от кодировки (например, очень популярный UTF-8 отображает LSB в таблицу ASCII).

0 голосов
/ 20 октября 2011

На первый вопрос, почему printf не работает так, как задумано, уже ответил Юлисар.Другой вопрос о суммировании шестнадцатеричного представления символа немного сложнее.Преобразование из строк в числовые значения с помощью функции _tstoi () будет работать только в том случае, если данная строка представляет число, подобное «123», преобразуется в 123. То, что вам нужно, это сумма представления символов.

в случае кодовых точек Unicode ниже 0x7F (0 ... 127) это просто сумма 1-байтового представления UTF-8.Однако в Windows, скомпилированной с флагом UNICODE, используется представление 2 байта на символ.Запуск следующего кода в отладчике вызовет это.

// ASCII 1 Byte per character
const char* letterA = "A";
int sumOfLetterA = letterA[0] + letterA[0]; // gives 130

// 2 Bytes per character (Windows)
const wchar_t* letterB = TEXT("B");
int sumOfLetterB = letterB[0] + letterB[0]; // gives 132
...