将函数从wchar_t数组转换为long int

时间:2012-10-22 11:28:50

标签: c++ c unicode encoding

我正在编写一个将wchar_t数组转换为long integer值的函数(该函数忽略空格beetwen digits)。看看我的代码:

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("")));编写的文件也许这就是原因?

3 个答案:

答案 0 :(得分:1)

您的代码假定输入字符串仅由数字和空格组成,以null-character结尾。文件中的管道可能会以换行符结束字符串,然后为null。因此,您将'\ r'和'\ n'计为数字,从它们中减去'0'并相应地增加功率。

请尝试std::wcout << wchartol(L"30 237 740\r\n") << std::endl;并查看它是否产生相同的错误值。

编辑:这里有一些代码没有对字符串做任何假设,它会在连接字符串中的第一个整数时忽略任何空格,如果有的话。 它将指针设置在第一个char之后的位置,该char既不是数字也不是空格,并将所有数字从那里连接到字符串的开头:

// 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;
  }
}

(免责声明:我没有测试此代码,因此请自行承担风险)

答案 1 :(得分: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。

答案 2 :(得分:0)

此循环错误

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

因为在测试之前递增,因此将找不到字符串开头的空格。我猜你的意思是

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