函数isalnum():意外结果

时间:2014-03-14 01:20:58

标签: c++

对于作业,我使用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');                                             

2 个答案:

答案 0 :(得分:1)

我写这篇文章时所呈现的代码整体上没有意义。

但是,如图所示,对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 ) ); }

!!只是为了使Visual C ++中的愚蠢警告沉默(警告&#34;表现&#34;,所有事情)。

免责声明:代码未触及编码器的手。


附录:如果您没有C ++ 11编译器,但只有C ++ 03,

typedef unsigned char Byte;

bool is_alphanumeric( char const ch )
{
    return !!std::isalnum( static_cast<Byte>( ch ) );
}

正如Bjarne所说,C ++ 11感觉就像一种全新的语言! ; - )

答案 1 :(得分:0)

我能够创建问题的解决方案。我注意到isalnum确实照顾了一些非alpha-numerics,但并不是所有的时间。由于上面的代码是一个函数的一部分,我每次都会调用它,并且每次都会给出精确的结果。然后我想出了一个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);