我正在编写一个将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("")));
编写的文件也许这就是原因?
答案 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++;
}