0

wchar_t配列を値に変換する関数を作成していlong integerます (この関数は数字の間のスペースを無視します)。私のコードを見てください:

long wchartol(wchar_t *strArray, long retVal = 0) {
  wchar_t *firstArray = strArray;
  long pow;
  int count, i;
  count = 0;
  i = 0;
  pow = 1;
  while(*firstArray != L'\0') {
    //firstArray++;
    if(*firstArray++ == L' ')continue;
    count++;
  }
  firstArray--;
  while(i < count) {
    if(*firstArray != L' ') {
      retVal += (*firstArray - L'0') * pow;
      pow*=10;
      i++;
    }
    firstArray--;
  }
  return retVal;
}

別の面白い問題があります。ファイルから数字データ (スペースを含む) をコピーして関数の引数に貼り付けると、関数から間違ったデータが返されます。しかし、これらのスペースをキーボードで入力したスペースに置き換えると、すべてうまく機能します。どういう理由ですか?この方法で関数を呼び出します。

std::wcout << wchartol(L"30 237 740") << std::endl;

outputstream.imbue(std::locale::global(std::locale("")));を使って書かれたファイルを読む

4

3 に答える 3

1

コードは、入力文字列が数字とスペースのみで構成され、null 文字で終了していると想定しています。ファイル内でパイプすると、文字列が改行で終わり、次に null で終わる可能性があります。その結果、'\r' と '\n' を数字として数え、それらから '0' を引き、それに応じて pow を増やします。

std::wcout << wchartol(L"30 237 740\r\n") << std::endl;同じ不正な値が生成されるかどうか試してみてください。

編集: これは、文字列について何も仮定しないコードです。文字列の最初の整数を連結するときに、スペースがあればそれを無視します。数字でもスペースでもない最初の文字の直後の位置にポインターを設定し、そこから文字列の先頭まですべての数字を連結します。

// move pointer to position after last character to be processed
while( (*firstArray >= L'0' && *firstArray <= L'9')* ||
        *firstArray == L' ')
  firstArray++;

// process all digits until start of string is reached
while(firstArray > strArray) {
  firstArray--;
  if(*firstArray >= L'0' && *firstArray <= L'9') {
    retVal += (*firstArray - L'0') * pow;
    pow*=10;
  }
}

(免責事項:私はこのコードをテストしていないので、自己責任で使用してください)

于 2012-10-22T11:49:32.250 に答える
0

wstringstreamを使用しないのはなぜですか?

wifstream in(...);
wstringstream ss;

wchar_t ch;
in >> ch;
while (in)
{
    if (ch != L' ')
        ss << ch;

    in >> ch;
}

long number;
ss >> number;

ファイルの問題については、ファイルのエンコーディングが Unicode ではない可能性があります。テキスト エディターでファイルを開き、ファイルを Unicode として保存するように指示してみてください。

于 2012-10-22T11:46:21.273 に答える
0

このループは間違っている

while(*firstArray != L'\0')
{
    firstArray++;
    if(*firstArray == L' ')continue;
    count++;
}

テストする前にインクリメントするため、文字列の先頭にスペースが見つかりません。私はあなたがこれを意味したと思います

while(*firstArray != L'\0')
{
    if(*firstArray++ == L' ')continue;
    count++;
}
于 2012-10-22T11:50:51.407 に答える