辅导:CRun-TimeLibrary函数__isascii&iswascii&__toascii
来源:优易学  2011-10-31 12:57:37   【优易学:中国教育考试门户网】   资料下载   IT书店

  Determines whether a particular character is an ASCII character.
  int __isascii(
  int c
  );
  int iswascii(
  wint_t c
  );
  测试程序:
  #include "stdafx.h"
  #include "ctype.h"
  #include "locale.h"
  #include "stdio.h"
  void CheckCharAndPrint(char acChar)
  {
  if(__isascii(acChar))
  {
  printf("char %c is a ascii char.\n",acChar);
  }
  else
  {
  // 此处无法正常输出中文,没有深入研究了
  printf("char %c is not a ascii char.\n",acChar);
  }
  }
  void CheckWCharAndPrint(wchar_t awcChar)
  {
  if(iswascii(awcChar))
  {
  wprintf(L"wchar %c is a ascii char.\n",awcChar);
  }
  else
  {
  setlocale(LC_ALL,"");
  wprintf(L"wchar %c is not a ascii char.\n",awcChar);
  }
  }
  int _tmain(int argc, _TCHAR* argv[])
  {
  char lcC = 'a';
  char lcD = '中';
  CheckCharAndPrint(lcC);
  CheckCharAndPrint(lcD);
  wchar_t lwcC = L'a';
  wchar_t lwcD = L'中';
  CheckWCharAndPrint(lwcC);
  CheckWCharAndPrint(lwcD);
  return 0;
  }
  说明:
  __isascii是一个比较特殊的函数,因为它以两个前置下划线开头。这在C语言中并不多见。(起码我看到的比较少)
  此函数应该不属于标准库函数,《TCPL》中,《C语言参考》中并没有描述,但是gcc中有此函数。也就是说linux下也能正常使用此函数。
  iswascii这个__isascii函数的宽字节版本,如同很多宽字节版本的函数一样,这个函数属于MS自己扩的,于是。。linux下无法使用此函数,要使用,只能自己实现罗。
  实现:
  MS:
  #define __isascii(_Char) ( (unsigned)(_Char) < 0x80 )
  inline int __cdecl iswascii(wint_t _C) {return ((unsigned)(_C) < 0x80); }
  gcc:
  #define __isascii(c) (((c) & ~0x7f) == 0) /* if C is a 7 bit value*/
  __isascii都是一个简单的宏。MS的iswascii原理和其__isascii都一样,仅仅是一个内联的函数。
  微软的实现是依赖于字符小于128(0x80),这里还做了一次强转,不是太理解,因为实际char可以直接作为整数来比较,也许仅仅是为了屏蔽warning?
  gcc的实现是依赖于字符除低七位外无任何其他值。即先将127(0x7f)取反,再与字符位与。实际就是取得字符c除了低七位以外的值。再比较此值是否为零。
  想不到一个这样简单的函数,MS,gcc的实现差别都这么大,相对而言MS的实现自然是比较浅显易懂的,但是gcc用这么复杂的实现,应该有更好的效率。
  就分析而言,强转+小于操作 运行时间大于 一次取反一次位与一次等于操作。还真不容易知道谁的效率真的更高。那么就测试一下吧。

[1] [2] 下一页

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训