C++ 函数isalnum():意外结果
对于赋值,我使用std::isalnum来确定输入是字母还是数字。作业的重点是创建一个“字典”。它在小段落上效果很好,但在文本页面上效果很差。下面是我正在使用的代码片段C++ 函数isalnum():意外结果,c++,C++,对于赋值,我使用std::isalnum来确定输入是字母还是数字。作业的重点是创建一个“字典”。它在小段落上效果很好,但在文本页面上效果很差。下面是我正在使用的代码片段 custom::String string; std::cin >> string; custom::String original = string; size_t size = string.Size();
custom::String string;
std::cin >> string;
custom::String original = string;
size_t size = string.Size();
char j;
size_t i = 0;
size_t beg = 0;
while( i < size)
{
j = string[i];
if(!!std::isalnum(static_cast<unsignedchar>(j)))
{
--size;
}
if( std::isalnum( j ) )
{
string[i-beg] = tolower(j);
}
++i;
}//end while
string.SetSize(size - beg, '\0');
custom::String;
std::cin>>字符串;
自定义::字符串原始=字符串;
size_t size=string.size();
查尔j;
尺寸i=0;
尺寸=0;
而(i
我写这篇文章时给出的代码整体上没有意义
但是,如图所示,对isalnum的调用只适用于普通ASCII,因为
- C字符分类函数需要非负参数,或者
作为参数,以及EOF
- 编码必须为每个字符单字节,并且
应该在使用函数之前调用setlocale
std::isalnum
:
using Byte = unsigned char;
auto is_alphanumeric( char const ch )
-> bool
{ return !!std::isalnum( static_cast<Byte>( ch ) ); }
正如比亚恩所说,C++11感觉像是一种全新的语言 我找到了解决这个问题的办法。我注意到isalnum确实处理了一些非字母数字,但并非一直如此。因为上面的代码是函数的一部分,所以我多次调用它,每次都给出精确的结果。然后我提出了一个do-while循环,它存储字符串的大小,调用函数,存储新的大小,并对它们进行比较。如果它们不一样,就意味着有可能需要再次调用。如果它们是相同的,则表示字符串已完全清洁。我猜isalnum工作不好的原因是因为我在读一本书的几章。这是我的密码:
custom::string abc;
std::cin >> abc;
size_t first = 0;
size_t second = 0;
//clean the word
do{
first = abc.Size();
Cleanup(abc);
second = abc.Size();
}while(first != second);
您是否缺少部分代码?最后一个括号和
在那里结束时是什么?我想您可以通过删除其中一个if(std::isalnum(j))
来获得一些性能,因为其中一个是else
-另一个的情况。很抱歉。代码已被编辑。现在应该有意义了。您从未在循环中更新j
,因此每次更正时它都会使用string[0]
,但输出仍然不正确。很抱歉这样做太草率。我对它进行了编辑,因此它应该更有意义。另外,代码只读取普通的ASCII码。你能解释一下C++11的代码以及它是如何工作的吗。我不太明白,它的工作原理与C++03的代码相同,只是使用了新的C++11语法。
custom::string abc;
std::cin >> abc;
size_t first = 0;
size_t second = 0;
//clean the word
do{
first = abc.Size();
Cleanup(abc);
second = abc.Size();
}while(first != second);