精品理论电影在线_日韩视频一区二区_一本色道精品久久一区二区三区_香蕉综合视频

Run-Time函數(shù)isascii&iswascii&toascii

發(fā)布時間:2011-08-29 共2頁

  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是一個比較特殊的函數(shù),因為它以兩個前置下劃線開頭。這在C語言中并不多見。(起碼我看到的比較少)
  此函數(shù)應(yīng)該不屬于標(biāo)準(zhǔn)庫函數(shù),《TCPL》中,《C語言參考》中并沒有描述,但是gcc中有此函數(shù)。也就是說linux下也能正常使用此函數(shù)。
  iswascii這個__isascii函數(shù)的寬字節(jié)版本,如同很多寬字節(jié)版本的函數(shù)一樣,這個函數(shù)屬于MS自己擴(kuò)的,于是。。linux下無法使用此函數(shù),要使用,只能自己實現(xiàn)羅。
  實現(xiàn):
  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都一樣,僅僅是一個內(nèi)聯(lián)的函數(shù)。
  微軟的實現(xiàn)是依賴于字符小于128(0x80),這里還做了一次強(qiáng)轉(zhuǎn),不是太理解,因為實際char可以直接作為整數(shù)來比較,也許僅僅是為了屏蔽warning?
  gcc的實現(xiàn)是依賴于字符除低七位外無任何其他值。即先將127(0x7f)取反,再與字符位與。實際就是取得字符c除了低七位以外的值。再比較此值是否為零。
  想不到一個這樣簡單的函數(shù),MS,gcc的實現(xiàn)差別都這么大,相對而言MS的實現(xiàn)自然是比較淺顯易懂的,但是gcc用這么復(fù)雜的實現(xiàn),應(yīng)該有更好的效率。
  就分析而言,強(qiáng)轉(zhuǎn)+小于操作 運(yùn)行時間大于 一次取反一次位與一次等于操作。還真不容易知道誰的效率真的更高。那么就測試一下吧。

百分百考試網(wǎng) 考試寶典

立即免費(fèi)試用