C++ 函数isalnum():意外结果

C++ 函数isalnum():意外结果,c++,C++,对于赋值,我使用std::isalnum来确定输入是字母还是数字。作业的重点是创建一个“字典”。它在小段落上效果很好,但在文本页面上效果很差。下面是我正在使用的代码片段 custom::String string; std::cin >> string; custom::String original = string; size_t size = string.Size();

对于赋值,我使用std::isalnum来确定输入是字母还是数字。作业的重点是创建一个“字典”。它在小段落上效果很好,但在文本页面上效果很差。下面是我正在使用的代码片段

 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);