0

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

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("")));Maybe编写的文件是原因吗?

4

3 回答 3

1

您的代码假定输入字符串仅由数字和空格组成,以空字符结尾。文件中的管道可能会以换行符结束字符串,然后为空。因此,您将 '\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

这个循环是错误的

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 回答
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 回答