国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

C語(yǔ)言編程常見(jiàn)問(wèn)題解答之標(biāo)準(zhǔn)庫(kù)函數(shù)(2)

2019-11-17 05:41:51
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
    12.5 對(duì)字符串進(jìn)行操作的標(biāo)準(zhǔn)庫(kù)函數(shù)有哪些?
    簡(jiǎn)單的回答是:(string.h)中的函數(shù)。
    C語(yǔ)言沒(méi)有固有的字符串類型,但c程序可以用以NUL(’\O’)字符結(jié)束的字符數(shù)組來(lái)代替字符串。
    C程序(以及c程序員)應(yīng)該保證數(shù)組足夠大,以容納所有將要存入的內(nèi)容。這一點(diǎn)可以通過(guò)以下三種方法來(lái)實(shí)現(xiàn):
    (1)分配大量的空間,并假定它足夠大,不考慮它不夠大時(shí)將產(chǎn)生的問(wèn)題(這種方法效率高,但在空間不足時(shí)會(huì)產(chǎn)生嚴(yán)重的問(wèn)題);
    (2)總是分配并重新分配所需大小的空間(假如使用realloc()函數(shù),這種方法的效率不會(huì)太低;這種方法需要使用大量代碼,并且會(huì)耗費(fèi)大量運(yùn)行時(shí)間);
    (3)分配應(yīng)該足夠的空間,并禁止占用更多的空間(這種方法既安全又高效,但可能會(huì)丟失數(shù)據(jù))。
    注重:C++提供了第4種方法:直接定義一種string類型。由于種種原因,用C++完成這項(xiàng)工作要比用C簡(jiǎn)單得多。即便如此,用C++還是顯得有點(diǎn)麻煩。幸運(yùn)的是,盡管定義一個(gè)標(biāo)準(zhǔn)的C++ string類型并不簡(jiǎn)單,但這種類型使用起來(lái)卻非常方便。
    有兩組函數(shù)可用于C語(yǔ)言的字符串處理。第一組函數(shù)(strcpy,strcat,等等)按第一種或第二種方法工作。這組函數(shù)完全按需要拷貝字符串或使用內(nèi)存,因此最好留出所需的全部空間,否則程序就可能出錯(cuò)。大多數(shù)C程序員使用第一組函數(shù)。第二組函數(shù)(strncpy,strncat,等等)按第三種方法工作。這組函數(shù)需要知道應(yīng)該使用多大的空間,并且永遠(yuǎn)不會(huì)占用更多的空間,因此它們會(huì)忽略所有已無(wú)法容納的數(shù)據(jù)。
    函數(shù)strncpy()和strncat()中的參數(shù)“n”(第三個(gè))的意義是不同的:
    對(duì)strncpy()函數(shù)來(lái)說(shuō),它意味著只能使用“n”個(gè)字符的空間,包括末尾的NUL字符。
strncpy()函數(shù)也恰好只拷貝“n”個(gè)字符。假如第二個(gè)參數(shù)沒(méi)有這么多字符,strncpy()函數(shù)會(huì)用NUL字符填充剩余的空間。假如第二個(gè)參數(shù)有多于“n”個(gè)的字符,那么strncpy()函數(shù)在還沒(méi)有拷貝到NUL字符之前就結(jié)束工作了。這意味著,在使用strncpy()函數(shù)時(shí),你應(yīng)該總是自己在目標(biāo)字符串的末尾加上NUL字符,而不要指望strncpy()函數(shù)為你做這項(xiàng)工作。
    對(duì)strncat()函數(shù)來(lái)說(shuō),它意味著最多只能拷貝“n”個(gè)字符,假如需要還要加上一個(gè)NUL字符。因?yàn)槟阏嬲赖氖悄繕?biāo)字符串能存放多少個(gè)字符,所以通常你要用strlen()函數(shù)來(lái)計(jì)算可以拷貝的字符數(shù)。
    函數(shù)strncpy()和strncat()之間的區(qū)別是“歷史性”的(這是一個(gè)技術(shù)用語(yǔ),指的是“它對(duì)某些人確實(shí)起到了一定的作用,并且它可能是處理問(wèn)題的正確途徑,但為什么正確至今仍然說(shuō)不清楚”)。
    例12.5a給出了一個(gè)使用strncpy()和strncat()函數(shù)的程序。

  .注重:你應(yīng)該去了解一下"string-n”函數(shù),雖然它們使用起來(lái)有些困難,但用它們編寫(xiě)的程序兼容性更好,錯(cuò)誤更少。    假如你愿意的話,可以用函數(shù)strcpy()和strcat()重新編寫(xiě)例12.5a中的程序,并用很長(zhǎng)的足以溢出緩沖區(qū)的參數(shù)運(yùn)行它。會(huì)出現(xiàn)什么現(xiàn)象呢?計(jì)算機(jī)會(huì)掛起嗎?你會(huì)得到"GeneralPRotection Exception”或內(nèi)存信息轉(zhuǎn)儲(chǔ)這樣的消息嗎?請(qǐng)參見(jiàn)7.24中的討論。
    例12.5a使用"string—n”函數(shù)的一個(gè)例子
# include <stdio. h>
# include <string. h>
/*
Normally, a constant like MAXBUF would be very large, to
help ensure that the buffer doesn't overflow.  Here, it's very
small, to show how the "string-n" functions prevent it from
ever overflowing.
 */
# define MAXBUF 16
int
main (int argc, char* * argv)
{
         char buf[MAXBUF];
         int i;
         buf[MAXBUF - 1] = '/0';
         strncpy(buf,  argv[0], MAXBUF-1);
         for (i = 1; i<argc;  ++i) {
                strncat(buf, "   " ,
                  MAXBUF -1 - strlen (buf) ) ;
                strncat(buf, argv[i],
                  MAXBUF -1 - strlen (buf ) ) ;
        }
        puts (buf );
        return 0;
}

    注重:許多字符串函數(shù)都至少有兩個(gè)參數(shù),在描述它們時(shí),與其稱之為“第一個(gè)參數(shù)”和“第二個(gè)參數(shù)”,還不如稱之為“左參數(shù)”和“右參數(shù)”。
    函數(shù)strcpy()和strncpy()用來(lái)把字符串從一個(gè)數(shù)組拷貝到另一個(gè)數(shù)組,即把右參數(shù)的值拷貝到左參數(shù)中,這與賦值語(yǔ)句的順序是一樣的。
    函數(shù)strcat()和strncat()用來(lái)把一個(gè)字符串連接到另一個(gè)字符串的末尾。例如,假如數(shù)組a1的內(nèi)容為“dog”,數(shù)組a2的內(nèi)容為“wood”,那么在調(diào)用strcat(al,a2)后,a1將變?yōu)椤癲ogwood”。
    函數(shù)strcmp()和strncmp()用來(lái)比較兩個(gè)字符串。當(dāng)左參數(shù)小于、等于或大于右參數(shù)時(shí),它們都分別返回一個(gè)小于、等于或大于零的值。常見(jiàn)的比較兩個(gè)字符串是否相等的寫(xiě)法有以下兩種:
    if (strcmp(sl, s2)) {
       / *  si !=s2 * /
    }
 和
    if (! strcmp(s1, s2)) {
      /*  s1 ==s2 * /
    }
    上述代碼可能并不易讀,但它們是完全有效并且相當(dāng)常見(jiàn)的c代碼,你應(yīng)該記住它們。假如在比較字符串時(shí)還需要考慮當(dāng)前局部環(huán)境(locale,見(jiàn)12.8),則要使用strcoll()函數(shù)。
  有一些函數(shù)用來(lái)在字符串中進(jìn)行檢索(在任何情況下,都是在左參數(shù)或第一個(gè)參數(shù)中進(jìn)行檢索)。函數(shù)strchr()和strrchr()分別用來(lái)查找某個(gè)字符在一個(gè)字符串中第一次和最后一次出現(xiàn)的位置(假如函數(shù)strchr()和strrchr()有帶“n”字母的版本,那么函數(shù)memchr()和memrchr()是最接近這種版本的函數(shù))。函數(shù)strspn()、strcspn()(“c”表示"complement")和strpbrk()用來(lái)查找包含指定字符或被指定字符隔開(kāi)的子字符串:
n = strspn("Iowa" , "AEIOUaeiou");
/ *  n = 2( "Iowa" starts with 2 vowels * /
n=strcspn("Hello world" ,"/t" ) ;
/ *  n = 5; white space after 5 characters  * /
p = strbrk("Hellb world" ,"/t" ) ;
/ *  p points to blank  * /

函數(shù)strstr()用來(lái)在一個(gè)字符串中查找另一個(gè)字符串:
p = strstr("Hello world", "or");
/ * p points to the second "or"  * /

    函數(shù)strtok()按照第二個(gè)參數(shù)中指定的字符把一個(gè)字符串分解為若干部分。函數(shù)strtok()具有“破壞性”,它會(huì)在原字符串中插入NUL字符(假如原字符串還要做其它的改變,應(yīng)該拷貝原字符串,并將這份拷貝傳遞給函數(shù)strtok())。函數(shù)strtok()是不能“重新進(jìn)入”的,你不能在一個(gè)信號(hào)處理函數(shù)中調(diào)用strtok()函數(shù),因?yàn)樵谙乱淮握{(diào)用strtok()函數(shù)時(shí)它總是會(huì)“記住”上一次被調(diào)用時(shí)的某些參數(shù)。strtok()函數(shù)是一個(gè)古怪的函數(shù),但它在分解以逗號(hào)或空白符分界的數(shù)據(jù)時(shí)是非常有用的。例12.5b給出了一個(gè)程序,該程序用strtok()函數(shù)把一個(gè)句子中的單詞分解出來(lái):
    例12.5b一個(gè)使用strtok()的例子
# include <stdio. h>
# include <string. h>
static char buf[] = "Now is the time for all good men . . . " ;
int
main()
{
         char *  p;
         p = strtok(buf, "  ") ;
         while  (p )  {
                 printf("%s/n" ,p);
                 p = strtok(NULL, "   ");
          }
         return 0;
}

    請(qǐng)參見(jiàn):
    4.18怎樣讀寫(xiě)以逗號(hào)分界的文本?
    第6章字符串操作
    7.23 NULL和NUI。有什么不同?
    9.9   字符串和數(shù)組有什么不同?
    12.8  什么是“局部環(huán)境(10cale)”?
    12.10 什么是信號(hào)(signal)?用信號(hào)能做什么?
<

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 德阳市| 石渠县| 会同县| 咸丰县| 南丹县| 图木舒克市| 桐庐县| 永济市| 阿克苏市| 兴隆县| 抚松县| 延津县| 遂宁市| 佛坪县| 温泉县| 绥化市| 宝清县| 崇明县| 庆安县| 武胜县| 横峰县| 林西县| 会泽县| 雷州市| 偏关县| 蚌埠市| 鹤壁市| 宿州市| 彭泽县| 东乌| 宁陕县| 陆河县| 晴隆县| 靖安县| 遂川县| 平利县| 文安县| 资兴市| 甘孜| 普兰店市| 天气|