• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            HyJune的專(zhuān)欄

            Linux From Scratch

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              10 隨筆 :: 11 文章 :: 6 評(píng)論 :: 0 Trackbacks
            from: http://blog.csdn.net/wuliming_sc/archive/2006/11/04/1365923.aspx

            1. 什么是標(biāo)準(zhǔn)預(yù)定義宏?
            2. 連接運(yùn)算符“##”和字符串化運(yùn)算符"#"有什么作用?
            3. 怎樣刪去字符串尾部的空格?
            4. 怎樣刪去字符串頭部的空格?
            5. 怎樣打印字符串的一部分?
            6. 用malloc()函數(shù)更好還是用calloc()函數(shù)更好?
            7. NULL和NUL有什么不同?
            8. 在程序退出main()函數(shù)之后,還有可能執(zhí)行一部分代碼嗎?
            9. 數(shù)組作為函數(shù)的常數(shù)時(shí),可以通過(guò)sizeof運(yùn)算符得到函數(shù)數(shù)組的大小嗎?
            10. array_name和&array_name有什么不同?
            11. 怎樣判斷一個(gè)字符是數(shù)字、字母或其它類(lèi)別的符號(hào)?

            什么是標(biāo)準(zhǔn)預(yù)定義宏?

            ANSIC標(biāo)準(zhǔn)定義了以下6種可供C語(yǔ)言使用的預(yù)定義宏:
            ----------------------------------------------------------------------------
               宏  名                     作    用
            ----------------------------------------------------------------------------
              __LINE__           在源代碼中插入當(dāng)前源代碼行號(hào)
              __FILE__           在源代碼中插入當(dāng)前源代碼文件名
              __DATE__           在源代碼中插入當(dāng)前編譯日期〔注意和當(dāng)前系統(tǒng)日期區(qū)別開(kāi)來(lái)〕
              __TIME__           在源代碼中插入當(dāng)前編譯時(shí)間〔注意和當(dāng)前系統(tǒng)時(shí)間區(qū)別開(kāi)來(lái)〕 
              __STDC__           當(dāng)要求程序嚴(yán)格遵循ANSIC標(biāo)準(zhǔn)時(shí)該標(biāo)識(shí)符被賦值為1。
            ----------------------------------------------------------------------------

            標(biāo)識(shí)符__LINE__和__FILE__通常用來(lái)調(diào)試程序;標(biāo)識(shí)符__DATE__和__TIME__通常用來(lái)在編譯后的程序中加入一個(gè)時(shí)間標(biāo)志,以區(qū)分程序的不同版本;當(dāng)要求程序嚴(yán)格遵循ANSIC標(biāo)準(zhǔn)時(shí),標(biāo)識(shí)符__STDC__就會(huì)被賦值為1;當(dāng)用C++編譯程序編譯時(shí),標(biāo)識(shí)符__cplusplus就會(huì)被定義。
             1 #include <stdio.h>
             2 
             3 int main ()
             4 {
             5     printf("該輸出行在源程序中的位置:%d\n", __LINE__ );
             6     printf("該程序的文件名為:%s\n", __FILE__ );
             7     printf("當(dāng)前日期為:%s\n", __DATE__ );
             8     printf("當(dāng)前時(shí)間為:%s\n", __TIME__ );
             9 
            10     return 0;
            11 }

            連接運(yùn)算符“##”和字符串化運(yùn)算符"#"有什么作用?

            連接運(yùn)算符“##”可以把兩個(gè)獨(dú)立的字符串連接成一個(gè)字符串。在C的宏中,經(jīng)常用到“##”運(yùn)算符,請(qǐng)看下例:
             1 #include <stdio.h>
             2 
             3 int main ()
             4 {
             5     printf("該輸出行在源程序中的位置:%d\n", __LINE__ );
             6     printf("該程序的文件名為:%s\n", __FILE__ );
             7     printf("當(dāng)前日期為:%s\n", __DATE__ );
             8     printf("當(dāng)前時(shí)間為:%s\n", __TIME__ );
             9 
            10     return 0;
            11 }

            在該例中,宏SORT利用“##”運(yùn)算符把字符串sort_function和經(jīng)參數(shù)x傳遞過(guò)來(lái)的字符串連接起來(lái),這意味著語(yǔ)句 SORT(3)(array,elemnts,element_size) 將被預(yù)處理程序轉(zhuǎn)換為語(yǔ)句:
                sort_function3(array,elements,element_size);

            從宏SORT的用法中你可以看出,如果在運(yùn)行時(shí)才能確定要調(diào)用哪個(gè)函數(shù),你可以利用“##”運(yùn)算符動(dòng)態(tài)地構(gòu)造要調(diào)用的函數(shù)的名稱(chēng)。
             1 
             2 #include<stdio.h>
             3 
             4 #define FUNC(X)  func ## X
             5 
             6 int func1(int a, int b)
             7 {
             8     return 1;
             9 }
            10 
            11 int func2(int a, int b)
            12 {
            13     return 2;
            14 
            15 
            16 int main()
            17 {
            18     int  a, b, result;
            19     result = FUNC(1)(a, b);
            20     printf("---%d---\n", result);
            21 
            22     result = FUNC(2)(a, b);
            23     printf("---%d---\n", result);
            24 
            25     getchar();
            26 
            27     return 0;
            28 }
            字符串化運(yùn)算符"#"運(yùn)算符能將宏的參數(shù)轉(zhuǎn)換為帶雙引號(hào)的字符串,請(qǐng)看下例:

                define DEBUG_VALUE(v)  printf(#v"is equal to %d. \n", v)

                你可以在程序中用 DEBUG_VALUE 宏檢查變量的值,請(qǐng)看下例:

                int x=20;

                DEBUG_VALUE(x);

            上述語(yǔ)句將在屏幕上打印"x is equal to 20"。這個(gè)例子說(shuō)明,宏所使用的“#”運(yùn)算符是一種非常方便的調(diào)試工具。
             1 #include <stdio.h>
             2 
             3 #define DEBUG_VALUE_INT(v)  printf(#v" is equal to %d.\n",v )
             4 
             5 #define DEBUG_VALUE_STR(v)  printf(#v" is equal to %s.\n",v )
             6 
             7 int main(int)
             8 {
             9       int x = 0;
            10       char str[] = "asdfqweqwfdvasdf";
            11 
            12       DEBUG_VALUE_INT(x);
            13 
            14       DEBUG_VALUE_STR(str);
            15 
            16       getchar();
            17 
            18       return 0;
            19 }
            20 

            怎樣刪去字符串尾部的空格?

            C語(yǔ)言沒(méi)有提供可刪去字符串尾部空格的標(biāo)準(zhǔn)庫(kù)函數(shù),但是,編寫(xiě)這樣的一個(gè)函數(shù)是很方便的。請(qǐng)看下例:
             1 #include <stdio.h>
             2 # include <string.h>
             3 
             4 char * rtrim( char * );
             5 
             6 int main()
             7 {
             8 
             9 //char * trail_str = "0123456789          "; 把字符串定義成這種形式時(shí),運(yùn)行程序的時(shí)候會(huì)出現(xiàn)異常
            10 
            11 char trail_str[21= "0123456789          ";
            12 
            13     printf( "Before calling rtrim(), trail_str is '%s'\n" , trail_str );
            14     printf( "and has a length of %d. \n" , strlen( trail_str ) );
            15 
            16     rtrim(trail_str);
            17 
            18     printf( "After calling rttim(), trail_ str is '%s'\n", trail_str );
            19     printf( "and has a length of %d. \n" , strlen( trail_str ) ) ;
            20 
            21     getchar();
            22 
            23     return 0;
            24 }

             1 /* The rtrim() function removes trailing spaces from a string. */
             2 
             3 char * rtrim( char * str )
             4 {
             5     int n = strlen(str) - 1;
             6 
             7     while( n > 0 )
             8     {
             9         if*( str + n ) != ' ' )
            10         {
            11             //在windows下,將str字符串的某一位設(shè)置為值 '\0' 時(shí),會(huì)出現(xiàn)異常..
            12             *( str + n + 1 ) = '\0';
            13             break ;
            14         } else {
            15             printf("%c, %d\n", str[n], str[n] );
            16             n--;
            17         }
            18     }
            19 
            20     return str; 
            21 }
            在上例中,rtrim()是用戶(hù)編寫(xiě)的一個(gè)函數(shù),它可以刪去字符串尾部的空格。函數(shù)rtrim()從字符串中位于null字符前的那個(gè)字符開(kāi)始往回檢查每個(gè)字符,當(dāng)遇到第一個(gè)不是空格的字符時(shí),就將該字符后面的字符替換為null字符。因?yàn)樵贑語(yǔ)言中null字符是字符串的結(jié)束標(biāo)志,所以函數(shù)rtrim()的作用實(shí)際上就是刪去字符串尾部的所有空格。

            怎樣刪去字符串頭部的空格?

            C語(yǔ)言沒(méi)有提供可刪去字符串頭部空格的標(biāo)準(zhǔn)庫(kù)函數(shù),但是,編寫(xiě)這樣的一個(gè)函數(shù)是很方便的。請(qǐng)看下例:

             1 #include <stdio.h>
             2 #include <string.h>
             3 
             4 char *ltrim(char * );
             5 char *rtrim(char * );
             6 
             7 void main (void)
             8 {
             9 
            10 }
            11 
            12 char * ltrim(char * str)
            13 {
            14 
            15     strrev(str);    /* Call strrev to reverse the string. */
            16     rtrim(str);     /* Call rtrim to remvoe the "trailing" spaces. */
            17 
            18     strrev(str);    /* Restore the string's original order. */
            19 
            20     return str ;    /* Return a pointer to the string. */
            21 }
            22 
            23 char* rtrim(char* str)
            24 {
            25 
            26 }
            在上例中,刪去字符串頭部空格的工作是由用戶(hù)編寫(xiě)的ltrim()函數(shù)完成的,該函數(shù)調(diào)用了6.2的例子中的rtrim()函數(shù)和標(biāo)準(zhǔn)C庫(kù)函數(shù)strrev()。ltrim()函數(shù)首先調(diào)用strrev()函數(shù)將字符串顛倒一次,然后調(diào)用rtrim()函數(shù)刪去字符串尾部的空格,最后調(diào)用strrev()函數(shù)將字符串再顛倒一次,其結(jié)果實(shí)際上就是刪去原字符串頭部的空格。

            怎樣打印字符串的一部分?

            使用printf()函數(shù)打印字符串的任意部分,請(qǐng)看下例:
             1 #include <stdio.h>
             2 #include <stdlib.h>
             3 #include <string.h>
             4 
             5 int main()
             6 
             7 {
             8 
             9     char * source_str = "THIS IS THE SOURCE STRING" ;
            10 
            11     /* Use printfO to print the first 11 characters of source_str. */
            12     printf("First 11 characters: ' %11.11s'\n" , source_str);
            13 
            14     /* Use printf() to print only the last 13 characters of source _str. */
            15     printf("Last 13 characters:'%13.13s'\n", source_str+(strlen(source_str)-13));
            16 }
            17 

                輸出結(jié)果為:  
                First 11 characters: 'THIS IS THE'  
                Last 13 characters:'SOURCE STRING'

            在上例中,第一次調(diào)用printf()函數(shù)時(shí),通過(guò)指定參數(shù)"%11.11s",迫使printf()函數(shù)只打印11個(gè)字符的長(zhǎng)度,因?yàn)樵醋址拈L(zhǎng)度大于11個(gè)字符,所以在打印時(shí)源字符串將被截掉一部分,只有頭11個(gè)字符被打印出來(lái)。第二次調(diào)用printf()函數(shù)時(shí),它將源字符串的最后13個(gè)字符打印出來(lái),其實(shí)現(xiàn)過(guò)程為:
            (1)用strlen()函數(shù)計(jì)算出source_str字符串的長(zhǎng)度,即strlen(source_str)。
            (2)將source_str的長(zhǎng)度減去13(13是將要打印的字符數(shù)),得出source_str中剩余字符數(shù),且pstrlen(source_str)-13。
            (3)將strlen(source_str)-13和source_str的地址相加,得出指向source_str中倒數(shù)第13個(gè)字符的地址的指針;即source_str+(strlen(source_str)-13)。這個(gè)指針就是printf()函數(shù)的第二個(gè)參數(shù)。
            (4)通過(guò)指定參數(shù)“%13.13s”,迫使printf()函數(shù)只打印13個(gè)字符的長(zhǎng)度,其結(jié)果實(shí)際上就是打印源字符串的最后13個(gè)字符。

            用malloc()函數(shù)更好還是用calloc()函數(shù)更好?

            函數(shù)malloc()和calloc()都可以用來(lái)分配動(dòng)態(tài)內(nèi)存空間,但兩者稍有區(qū)別。malloc()函數(shù)有一個(gè)參數(shù),即要分配的內(nèi)存空間的大小:  
                void *malloc(size_t size);  
            calloc()函數(shù)有兩個(gè)參數(shù),分別為元素的數(shù)目和每個(gè)元素的大小,兩個(gè)參數(shù)的乘積就是要分配的空間的大小:  
                void *calloc(size_t numElements,size_t sizeOfElement);
            如果調(diào)用成功,函數(shù)malloc()和calloc()都將返回所分配的內(nèi)存空間的首地址。
            malloc()函數(shù)和calloc()函數(shù)的主要區(qū)別是前者不能初始化所分配的內(nèi)存空間,而后者能。如果由malloc()函數(shù)分配的內(nèi)存空間原來(lái)沒(méi)有被使用過(guò),則其中的每一位可能都是0;反之,如果這部分內(nèi)存空間曾經(jīng)被分配、釋放和重新分配,則其中可能遺留各種各樣的數(shù)據(jù)。也就是說(shuō),使用malloc()函數(shù)的程序開(kāi)始時(shí)(內(nèi)存空間還沒(méi)有被重新分配)能正常運(yùn)行,但經(jīng)過(guò)一段時(shí)間后(內(nèi)存空間已被重新分配)可能會(huì)出現(xiàn)問(wèn)題。

            calloc()函數(shù)會(huì)將所分配的內(nèi)存空間中的每一位都初始化為零,也就是說(shuō),如果你是為字符類(lèi)型或整數(shù)類(lèi)型的元素分配內(nèi)存,那么這些元素將保證會(huì)被初始化為零;如果你是為指針類(lèi)型的元素分配內(nèi)存,那么這些元素通常(但無(wú)法保證)會(huì)被初始化為空指針;如果你是為實(shí)數(shù)類(lèi)型的元素分配內(nèi)存,那么這些元素可能(只在某些計(jì)算機(jī)中)會(huì)被初始化為浮點(diǎn)型的零。

            malloc()函數(shù)和calloc()函數(shù)的另一點(diǎn)區(qū)別是calloc()函數(shù)會(huì)返回一個(gè)由某種對(duì)象組成的數(shù)組,但malloc()函數(shù)只返回一個(gè)對(duì)象。為了明確是為一個(gè)數(shù)組分配內(nèi)存空間,有些程序員會(huì)選用calloc()函數(shù)。但是,除了是否初始化所分配的內(nèi)存空間這一點(diǎn)之外,絕大多數(shù)程序員認(rèn)為以下兩種函數(shù)調(diào)用方式?jīng)]有區(qū)別:
                calloc( numElements,sizeOfElement );
                malloc( numElements * sizeOfElement );

            需要解釋的一點(diǎn)是,理論上(按照ANSIC標(biāo)準(zhǔn))指針的算術(shù)運(yùn)算只能在一個(gè)指定的數(shù)組中進(jìn)行,但是在實(shí)踐中,即使C編譯程序或翻譯器遵循這種規(guī)定,許多C程序還是沖破了這種限制。因此,盡管malloc()函數(shù)并不能返回一個(gè)數(shù)組,它所分配的內(nèi)存空間仍然能供一個(gè)數(shù)組使用(對(duì)realloc()函數(shù)來(lái)說(shuō)同樣如此,盡管它也不能返回一個(gè)數(shù)組)。總之,當(dāng)你在calloc()函數(shù)和malloc()函數(shù)之間作選擇時(shí),你只需考慮是否要初始化所分配的內(nèi)存空間,而不用考慮函數(shù)是否能返回一個(gè)數(shù)組。

            NULL和NUL有什么不同?

            NULL是在<stddef.h>頭文件中專(zhuān)門(mén)為空指針定義的一個(gè)宏。NUL是ASCII字符集中第一個(gè)字符的名稱(chēng),它對(duì)應(yīng)于一個(gè)零值。C語(yǔ)言中沒(méi)有NUL這樣的預(yù)定義宏。注意:在ASCII字符集中,數(shù)字0對(duì)應(yīng)于十進(jìn)制值80,不要把數(shù)字0和'\0'(NUL)的值混同起來(lái)。

            NULL可以被定義為(void *)0,而NUL可以被定義為'\0'。NULL和NUL都可以被簡(jiǎn)單地定義為0,這時(shí)它們是等價(jià)的,可以互換使用,但這是一種不可取的方式。為了使程序讀起來(lái)更清晰,維護(hù)起來(lái)更容易,你在程序中應(yīng)該明確地將NULL定義為指針類(lèi)型,而將NUL定義為字符類(lèi)型。
             
            在程序退出main()函數(shù)之后,還有可能執(zhí)行一部分代碼嗎?

            可以,但這要借助C庫(kù)函數(shù)atexit()。利用atexit()函數(shù)可以在程序終止前完成一些“清理”工作——如果將指向一組函數(shù)的指針傳遞給atexit()函數(shù),那么在程序退出main()函數(shù)后(此時(shí)程序還未終止)就能自動(dòng)調(diào)用這組函數(shù)。在使用atexit()函數(shù)時(shí)你要注意這樣兩點(diǎn):

            第一: 由atexit()函數(shù)指定的要在程序終止前執(zhí)行的函數(shù)要用關(guān)鍵字void說(shuō)明,并且不能帶參數(shù);

            第二: 由atexit()函數(shù)指定的函數(shù)在入棧時(shí)的順序和調(diào)用atexit()函數(shù)的順序相反,即它們?cè)趫?zhí)行時(shí)遵循后進(jìn)先出(LIFO)的原則。

             1 #include<stdlib.h>
             2 #include<stdio.h>
             3 
             4 void my_exit1(void)
             5 {
             6     printf("my_exit1() function !\n");
             7 }              
             8 
             9 void my_exit2(void)
            10 {
            11     printf("my_exit2() function !\n");
            12 }
            13 
            14 
            15 int  main()
            16 {
            18     atexit ( my_exit1 );
            19     atexit ( my_exit2 );
            20     printf("now, eixt this program\n");
            21     exit(0);
            22 }
            輸出結(jié)果為:
            now, eixt this program...
            my_exit2() function !
            my_exit1() function !

            數(shù)組作為函數(shù)的常數(shù)時(shí),可以通過(guò)sizeof運(yùn)算符得到函數(shù)數(shù)組的大小嗎?

            不可以。當(dāng)把數(shù)組作為函數(shù)的參數(shù)時(shí),你無(wú)法在程序運(yùn)行時(shí)通過(guò)數(shù)組參數(shù)本身告訴函數(shù)該數(shù)組的大小,因?yàn)楹瘮?shù)的數(shù)組參數(shù)相當(dāng)于指向該數(shù)組第一個(gè)元素的指針。這意味著把數(shù)組傳遞給函數(shù)的效率非常高,也意味著程序員必須通過(guò)某種機(jī)制告訴函數(shù)數(shù)組參數(shù)的大小。為了告訴函數(shù)數(shù)組參數(shù)的大小,人們通常采用以下兩種方法:

            第一種方法是將數(shù)組和表示數(shù)組大小的值一起傳遞給函數(shù),例如memcpy()函數(shù)就是這樣做的:
                memcpy( dest,source,length );

            第二種方法是引入某種規(guī)則來(lái)結(jié)束一個(gè)數(shù)組,例如在C語(yǔ)言中字符串總是以ASCII字符NUL('\0')結(jié)束,而一個(gè)指針數(shù)組總是以空指針結(jié)束。請(qǐng)看下述函數(shù),它的參數(shù)是一個(gè)以空指針結(jié)束的字符指針數(shù)組,這個(gè)空指針告訴該函數(shù)什么時(shí)候停止工作:
            1 void printMany( char *strings[] )  
            2     {
            3         int i = 0
            4         while( strings[i] != NULL )
            5         {
            6             puts(strings[i]);
            7             ++i;
            8         }
            9     }
            正象9.5中所說(shuō)的那樣,C程序員經(jīng)常用指針來(lái)代替數(shù)組下標(biāo),因此大多數(shù)C程序員通常會(huì)將上述函數(shù)編寫(xiě)得更隱蔽一些:
            1 void printMany( char *strings[] )
            2     {
            3         while*strings )
            4         {
            5             puts(*strings++);
            6         }
            7     }
            盡管你不能改變一個(gè)數(shù)組名的值,但是strings是一個(gè)數(shù)組參數(shù),相當(dāng)于一個(gè)指針,因此可以對(duì)它進(jìn)行自增運(yùn)算,并且可以在調(diào)用puts()函數(shù)時(shí)對(duì)strings進(jìn)行自增運(yùn)算 [注意辨別這種情況:對(duì)“int array[10] 數(shù)組的array不能進(jìn)行自加運(yùn)算”]。

            array_name和&array_name有什么不同?

            前者是指向數(shù)組中第一個(gè)元素的指針,后者是指向整個(gè)數(shù)組的指針。注意: 筆者建議讀者讀到這里時(shí)暫時(shí)放下本書(shū),寫(xiě)一下指向一個(gè)含MAX個(gè)元素的字符數(shù)組的指針變量的說(shuō)明。希望你不要敷衍了事,因?yàn)橹挥羞@樣你才能真正了解C語(yǔ)言表示復(fù)雜指針的句法的奧秘。下文將介紹如何獲得指向整個(gè)數(shù)組的指針。

            數(shù)組是一種類(lèi)型,它有三個(gè)要素,即基本類(lèi)型(數(shù)組元素的類(lèi)型),大小(當(dāng)數(shù)組被說(shuō)明為不完整類(lèi)型時(shí)除外),數(shù)組的值(整個(gè)數(shù)組的值)。你可以用一個(gè)指針指向整個(gè)數(shù)組的值:
                char a[MAX];    /*array of MAX characters*/
                char *p = a;   
                char *pa = &a;
            在運(yùn)行了上述這段代碼后,你就會(huì)發(fā)現(xiàn)p和pa的打印結(jié)果是一個(gè)相同的值,即p和pa指向同一個(gè)地址。但是,p和pa指向的對(duì)象是不同的。

            上述定義和以下定義是相同的,它們的含義都是“ap是一個(gè)含MAX個(gè)字符指針的數(shù)組”: char *ap[MAX].

            以下這種定義并不能獲得一個(gè)指向整個(gè)數(shù)組的值的指針:char *(ap[MAX]).

             
            怎樣判斷一個(gè)字符是數(shù)字、字母或其它類(lèi)別的符號(hào)?

            在頭文件ctype.h中定義了一批函數(shù),它們可用來(lái)判斷一個(gè)字符屬于哪一類(lèi)別。下面列出了這些函數(shù):
            ---------------------------------------------------------------------------------------
               函數(shù)         字符類(lèi)別               返回非零值的字符
            ---------------------------------------------------------------------------------------
              isdigit()     十進(jìn)制數(shù)               0--9
              isxdigit()    十六進(jìn)制數(shù)             0--9,a—f,或A--F
              isalnum()     字母數(shù)字符號(hào)           0--9,a--Z,或A--Z
              isalpha()     字母                   a—z或A--Z
              islower()     小寫(xiě)字母               a—z
              isupper()     大寫(xiě)字母               A--Z
              isspace()     空白符                 空格符,水平制表符,垂直制表符,換行符,換頁(yè)符,或回車(chē)符
              isgraph()     非空白字符             任何打印出來(lái)不是空白的字符(ASCII碼從21到7E)
              isprint()     可打印字符             所有非空白字符,加上空格符
              ispunct()     標(biāo)點(diǎn)符                 除字母數(shù)字符號(hào)以外的所有非空白字符
              iscntrl()     控制字符               除可打印字符外的所有字符(ASCII碼從00到1F,加上7F)
            ----------------------------------------------------------------------------------------

            與前文提到過(guò)的使用標(biāo)準(zhǔn)庫(kù)函數(shù)的好處相似,調(diào)用上述這些宏而不是自己編寫(xiě)測(cè)試字符類(lèi)別的程序也有三點(diǎn)好處。首先,這些宏運(yùn)算速度快,因?yàn)樗鼈兊膶?shí)現(xiàn)方式通常都是利用位屏蔽技術(shù)來(lái)檢查一個(gè)表,所以即使是進(jìn)行一項(xiàng)相當(dāng)復(fù)雜的檢查,也比真正去比較字符的值要快得多。其次,這些宏都是正確的。如果你自己編寫(xiě)一個(gè)測(cè)試程序,你很容易犯邏輯上或輸入上的錯(cuò)誤,例如引入了一個(gè)錯(cuò)誤的字符(或漏掉了一個(gè)正確的字符)。第三,這些宏是可移植的。信不信由你,并非所有的人都使用同樣的含PC擴(kuò)充字符的ASCII字符集。也許今天你還不太在意,但是,當(dāng)你發(fā)現(xiàn)你的下一臺(tái)計(jì)算機(jī)使用的是Unicode字符集而不是ASCII字符集,你就會(huì)慶幸自己原來(lái)沒(méi)有按照字符集中的字符值來(lái)編寫(xiě)程序。


            其他字符轉(zhuǎn)換函數(shù):

            isascii(測(cè)試字符是否為ASCII 碼字符)

            int isascii(int c);

            檢查參數(shù)c是否為ASCII碼字符,也就是判斷c的范圍是否在0到127之間。若參數(shù)c為ASCII碼字符,則返回TRUE,否則返回NULL(0)。

            toascii(將整型數(shù)轉(zhuǎn)換成合法的ASCII 碼字符)

            int toascii(int c);

            toascii()會(huì)將參數(shù)c轉(zhuǎn)換成7位的unsigned char值,第八位則會(huì)被清除,此字符即會(huì)被轉(zhuǎn)成ASCII碼字符。將轉(zhuǎn)換成功的ASCII碼字符值返回。

            tolower(將大寫(xiě)字母轉(zhuǎn)換成小寫(xiě)字母)

            int tolower(int c);

            若參數(shù)c為大寫(xiě)字母則將該對(duì)應(yīng)的小寫(xiě)字母返回。返回轉(zhuǎn)換后的小寫(xiě)字母,若不須轉(zhuǎn)換則將參數(shù)c值返回。

            toupper(將小寫(xiě)字母轉(zhuǎn)換成大寫(xiě)字母)

            int toupper(int c);

            若參數(shù)c為小寫(xiě)字母則將該對(duì)映的大寫(xiě)字母返回。返回轉(zhuǎn)換后的大寫(xiě)字母,若不須轉(zhuǎn)換則將參數(shù)c值返回。
             
            以isalmun為例,說(shuō)明這些函數(shù)的用法[剩余的其他函數(shù)跟它類(lèi)似]:
            int isalnum ( int c )

            檢查參數(shù)c是否為英文字母或阿拉伯?dāng)?shù)字,若參數(shù)c為字母或數(shù)字,則返回TRUE,否則返回NULL。此為宏定義,非真正函數(shù)。
             1 #include<stdio.h>
             2 #include <ctype.h>
             3 
             4 int main()
             5 {
             6     char str[]="123c@#FDsP[e?";
             7     int i;
             8     for( i = 0; str[i] != 0; i++ )
             9     {
            10 
            11         if( isalnum( str[i] ) )
            12             printf("%c is an alphanumeric character\n", str[i] );
            13     }
            14 
            15 }

            posted on 2008-05-22 15:34 martin0501 閱讀(541) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 1. C/C++系列
            久久精品国产99久久香蕉| 狠狠综合久久AV一区二区三区| 欧美精品国产综合久久| 久久国产免费观看精品| 久久精品国产亚洲AV香蕉| 午夜精品久久久久久毛片| 色8久久人人97超碰香蕉987| 亚洲国产精品无码久久98| 色偷偷88888欧美精品久久久| 亚洲国产一成人久久精品| 欧美喷潮久久久XXXXx| 久久人做人爽一区二区三区 | 国产日韩久久免费影院| 国产无套内射久久久国产| 看全色黄大色大片免费久久久 | 久久99久久无码毛片一区二区| 国产亚州精品女人久久久久久 | 99热热久久这里只有精品68| 久久久久99精品成人片 | 亚洲国产另类久久久精品小说| 久久久老熟女一区二区三区| 久久久久四虎国产精品| 热综合一本伊人久久精品| 亚洲αv久久久噜噜噜噜噜| 国产一区二区三区久久| 青青草国产97免久久费观看| 伊人久久综合精品无码AV专区| 国产午夜免费高清久久影院| 久久久精品人妻无码专区不卡| 亚洲va中文字幕无码久久不卡| 93精91精品国产综合久久香蕉 | 午夜不卡久久精品无码免费| 精品久久久久久国产| 狠狠色丁香久久婷婷综合_中| 69久久精品无码一区二区| 伊人久久五月天| 亚洲欧美日韩精品久久| 久久人人爽人人爽人人片AV不| 久久国产成人亚洲精品影院| 久久亚洲国产成人精品性色| 性高朝久久久久久久久久|