从std :: string&获取char整数值的std :: wstring的

时间:2011-10-20 09:16:43

标签: c++ winapi unicode unicode-string

我试图通过在C ++ WinAPI中将每个字母的int值相加来将字符串转换为数字。所以用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,&前面的代码为每个字母打印出零。我记得听说Unicode与ASCII字符串非常不同,你可以清除除了Unicode之外有什么不同之处有一个长度为30,000的字符库,而ASCII是256(我认为?)?

3 个答案:

答案 0 :(得分:3)

msdn文章说:

  

“输入字符串是可以解释的字符序列   作为指定类型的数值。该功能停止阅读   第一个字符处的输入字符串,它无法识别为   数字的一部分。“

如果使用包含实际数字的unicode字符串测试代码,您将看到正确的输出:

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

输出:

TEST 1: 1

与@Ylisar一样,* toi函数用于将数字值从字符串转换为整数变量。

以下代码将输出数字表示,但请注意const变量的指针表示。我已经离开了这两个版本,所以你可以看到差异:

  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 :(得分:1)

* toi系列函数将字符串表示形式转换为整数表示形式,即“10”变为10.您实际想要做的是根本不进行转换。将其更改为:

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

对于unicode,底层表示取决于编码(例如,非常流行的UTF-8,使用ASCII表映射LSB)。

答案 2 :(得分:0)

第一个问题,为什么 printf 无效,因为Ylisar已经回答了这个问题。关于对字符的十六进制表示求和的另一个问题稍微复杂一些。使用_tstoi()函数从字符串到数字值的转换仅在给定字符串表示像“123”转换为123的数字时才有效。您想要的是字符表示的总和。

如果Unicode代码点低于0x7F(0 ... 127),这只是1字节UTF-8表示的总和。但是在使用UNICODE标志编译的Windows上,使用了每字符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