亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C語言編程常見問題解答之標準庫函數(2)

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

  .注重:你應該去了解一下"string-n”函數,雖然它們使用起來有些困難,但用它們編寫的程序兼容性更好,錯誤更少。    假如你愿意的話,可以用函數strcpy()和strcat()重新編寫例12.5a中的程序,并用很長的足以溢出緩沖區的參數運行它。會出現什么現象呢?計算機會掛起嗎?你會得到"GeneralPRotection Exception”或內存信息轉儲這樣的消息嗎?請參見7.24中的討論。
    例12.5a使用"string—n”函數的一個例子
# 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;
}

    注重:許多字符串函數都至少有兩個參數,在描述它們時,與其稱之為“第一個參數”和“第二個參數”,還不如稱之為“左參數”和“右參數”。
    函數strcpy()和strncpy()用來把字符串從一個數組拷貝到另一個數組,即把右參數的值拷貝到左參數中,這與賦值語句的順序是一樣的。
    函數strcat()和strncat()用來把一個字符串連接到另一個字符串的末尾。例如,假如數組a1的內容為“dog”,數組a2的內容為“wood”,那么在調用strcat(al,a2)后,a1將變為“dogwood”。
    函數strcmp()和strncmp()用來比較兩個字符串。當左參數小于、等于或大于右參數時,它們都分別返回一個小于、等于或大于零的值。常見的比較兩個字符串是否相等的寫法有以下兩種:
    if (strcmp(sl, s2)) {
       / *  si !=s2 * /
    }
 和
    if (! strcmp(s1, s2)) {
      /*  s1 ==s2 * /
    }
    上述代碼可能并不易讀,但它們是完全有效并且相當常見的c代碼,你應該記住它們。假如在比較字符串時還需要考慮當前局部環境(locale,見12.8),則要使用strcoll()函數。
  有一些函數用來在字符串中進行檢索(在任何情況下,都是在左參數或第一個參數中進行檢索)。函數strchr()和strrchr()分別用來查找某個字符在一個字符串中第一次和最后一次出現的位置(假如函數strchr()和strrchr()有帶“n”字母的版本,那么函數memchr()和memrchr()是最接近這種版本的函數)。函數strspn()、strcspn()(“c”表示"complement")和strpbrk()用來查找包含指定字符或被指定字符隔開的子字符串:
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  * /

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

    函數strtok()按照第二個參數中指定的字符把一個字符串分解為若干部分。函數strtok()具有“破壞性”,它會在原字符串中插入NUL字符(假如原字符串還要做其它的改變,應該拷貝原字符串,并將這份拷貝傳遞給函數strtok())。函數strtok()是不能“重新進入”的,你不能在一個信號處理函數中調用strtok()函數,因為在下一次調用strtok()函數時它總是會“記住”上一次被調用時的某些參數。strtok()函數是一個古怪的函數,但它在分解以逗號或空白符分界的數據時是非常有用的。例12.5b給出了一個程序,該程序用strtok()函數把一個句子中的單詞分解出來:
    例12.5b一個使用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;
}

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情乱人伦| 精品久久久久久亚洲国产300| www欧美xxxx| 亚洲男人天堂手机在线| 性欧美暴力猛交69hd| 欧美视频在线免费看| 国产精品美女www| 欧美日韩国产精品一区二区三区四区| 日韩高清不卡av| 韩国精品久久久999| 国内精品久久久久| 91国产精品视频在线| 亚洲男人天堂视频| 亚洲国产欧美精品| 欧美精品在线第一页| 欧美日韩aaaa| 欧美网站在线观看| 亚洲第一男人天堂| 97欧美精品一区二区三区| 欧美高清不卡在线| 国产精品丝袜高跟| 色综合久综合久久综合久鬼88| 国产精品午夜一区二区欲梦| 日韩电视剧免费观看网站| 欧美日韩视频免费播放| 欧美插天视频在线播放| 亚洲色图五月天| 福利一区视频在线观看| 91精品视频在线| 九九热精品视频| 一本色道久久综合亚洲精品小说| 国外日韩电影在线观看| 亚洲性生活视频在线观看| 成人精品一区二区三区| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产精品视频网| 成人欧美一区二区三区在线| 亚洲无线码在线一区观看| 国外成人在线视频| 色噜噜狠狠狠综合曰曰曰88av| 在线电影av不卡网址| 欧美超级乱淫片喷水| 亚洲欧美日韩成人| 成人免费网站在线看| 日韩在线精品视频| 国产一区二区三区四区福利| 91国自产精品中文字幕亚洲| 久久久久国色av免费观看性色| 欧美在线观看日本一区| 伊人成人开心激情综合网| 欧美一区二三区| 亚洲精品国产品国语在线| 一道本无吗dⅴd在线播放一区| 欧美人在线视频| 亚洲国产小视频在线观看| 日韩在线中文字幕| 97国产精品视频人人做人人爱| 国产一区私人高清影院| 日韩欧美大尺度| 日韩av中文字幕在线免费观看| 久久精品视频中文字幕| 久久婷婷国产麻豆91天堂| 亚洲精品一二区| 日本亚洲欧洲色| 欧美日韩亚洲视频一区| 91精品国产综合久久久久久蜜臀| 欧美洲成人男女午夜视频| 九九热这里只有精品免费看| 亚洲成色999久久网站| 亚洲视频在线播放| 色综合久久久久久中文网| 国模精品系列视频| 国产+人+亚洲| 中文字幕自拍vr一区二区三区| 国产成人精品免高潮在线观看| 久久久91精品国产一区不卡| 欧美日韩成人精品| 亚洲人成网站色ww在线| 精品夜色国产国偷在线| 亚洲摸下面视频| 亚州欧美日韩中文视频| 亚洲欧美日韩国产中文| 97人人爽人人喊人人模波多| 日韩av免费在线播放| 亚洲一区二区在线播放| 91热精品视频| 久久久噜噜噜久久| 久久久精品久久| 国产99视频在线观看| 麻豆乱码国产一区二区三区| 国产精品视频自在线| 日韩精品在线观看网站| 欧美高清在线观看| 久久精品视频在线播放| 久久99国产综合精品女同| 欧美午夜精品久久久久久浪潮| 91精品国产高清久久久久久久久| 97视频在线观看视频免费视频| 理论片在线不卡免费观看| 日韩av在线免播放器| 久久影视电视剧凤归四时歌| 日韩欧美在线视频| 中文字幕在线观看日韩| 久久久久久久国产精品| 88国产精品欧美一区二区三区| 欧美精品在线网站| 国产精品午夜视频| 欧美色videos| 亚洲欧美国产精品久久久久久久| 国语自产精品视频在免费| 欧美高清不卡在线| 久久精品中文字幕电影| 亚洲一区二区久久| 欧美日韩亚洲国产一区| 8090成年在线看片午夜| 91欧美精品午夜性色福利在线| www.日韩不卡电影av| 性色av一区二区三区在线观看| 米奇精品一区二区三区在线观看| 欧美日韩国产精品一区二区不卡中文| 亚洲午夜性刺激影院| 成人激情在线观看| 日韩激情视频在线播放| 久久久av电影| 国产精品久久综合av爱欲tv| 国产精品高清在线观看| 亚洲毛片在线看| 亚洲欧美日韩一区二区三区在线| 日韩美女主播视频| 国产精品视频地址| 一区二区亚洲精品国产| 国内精品美女av在线播放| 欧美激情在线有限公司| 久久久成人的性感天堂| 亚洲欧美日韩在线高清直播| 亚洲**2019国产| 国产精品69久久久久| 欧美在线激情网| 欧美性黄网官网| 亚洲综合成人婷婷小说| 欧洲中文字幕国产精品| 国产精品视频免费观看www| 日韩美女在线观看| 亚洲成人激情图| 国产精品一二三视频| 日韩欧美亚洲国产一区| 在线日韩第一页| 国产在线精品一区免费香蕉| 欧美成人精品在线视频| 在线看欧美日韩| 国产精品十八以下禁看| 精品国产老师黑色丝袜高跟鞋| 亚洲精品视频网上网址在线观看| 色偷偷亚洲男人天堂| 45www国产精品网站| 亚洲国产精品女人久久久| 91福利视频在线观看| 亚洲码在线观看| 欧美与黑人午夜性猛交久久久| 亚洲片在线观看| 国产精品69精品一区二区三区| 韩国v欧美v日本v亚洲| 欧美在线激情视频| 18久久久久久|