0

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(私は思いますか?)

4

3 に答える 3

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 をご覧ください。

于 2011-10-20T09:38:39.297 に答える
1

*toi ファミリの関数は、文字列表現を整数表現に変換します。つまり、"10" は 10 になります。実際に実行したいのは、変換をまったく行わないことです。次のように変更します。

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

Unicode に関しては、基本的な表現はエンコーディングに依存します (たとえば、非常に一般的な UTF-8 は、LSB を ASCII テーブルにマップします)。

于 2011-10-20T09:29:13.500 に答える
0

最初の質問であるprintfが意図したとおりに機能しない理由は、Ylisar によって既に回答されています。文字の 16 進表現の合計に関するもう 1 つの問題は、もう少し複雑です。_tstoi() 関数を使用した文字列から数値への変換は、指定された文字列が「123」のような数値を表している場合にのみ機能します。必要なのは、文字表現の合計です。

0x7F (0...127) 未満の Unicode コード ポイントの場合、これは単に 1 バイトの UTF-8 表現の合計です。ただし、UNICODE フラグを使用してコンパイルされた Windows では、1 文字あたり 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
于 2011-10-20T10:05:05.010 に答える