乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      C++ strtok函數(shù)詳解

       流楚丶格念 2022-01-14

      文章目錄


      strtok函數(shù)的作用是把字符串以規(guī)定的字符分割開:

      頭文件

      #include <string.h>

      函數(shù)原型

      char *strtok(char s[], const char *delim);
      

      參數(shù)

      • str – 要被分解成一組小字符串的字符串。
      • delim – 包含分隔符的 C 字符串。

      返回值

      該函數(shù)返回被分解的第一個(gè)子字符串,如果沒(méi)有可檢索的字符串,則返回一個(gè)空指針。

      注意:

      1. 分割處理后原字符串 str 會(huì)變,變成第一個(gè)子字符串

      2. strtok函數(shù)會(huì)把分割前的字符串破壞掉,即每次分割后,原來(lái)的字符串就會(huì)少掉一部分,完整性會(huì)被破壞。

        例如:第一次分割之后,原字符串str是分割完成之后的第一個(gè)字符串,剩余的字符串存儲(chǔ)在一個(gè)靜態(tài)變量中,因此多線程同時(shí)訪問(wèn)該靜態(tài)變量時(shí),則會(huì)出現(xiàn)錯(cuò)誤

      使用案例

      strtok函數(shù)會(huì)破壞被分解字符串的完整,調(diào)用前和調(diào)用后的s已經(jīng)不一樣了。如果要保持原字符串的完整,可以使用strchr和sscanf的組合等。

      #include <string.h>
      #include <stdio.h>
       
      int main () {
         char str[80] = "this is - CSDN - blog";
         const char s[2] = "-";
         char *token;
         
         /* 獲取第一個(gè)子字符串 */
         token = strtok(str, s);
         
         /* 繼續(xù)獲取其他的子字符串 */
         while( token != NULL ) {
            printf( "%s\n", token );
          
            token = strtok(NULL, s);
         }
         
         return(0);
      }
      

      輸出

      this is 
       CSDN 
        blog
      

      拓展strtok_s與strtok_r

      strtok_s函數(shù)

      strtok_s是windows下的一個(gè)分割字符串安全函數(shù),其函數(shù)原型如下:

      char *strtok_s( char *strToken, const char *strDelimit, char **buf);
      

      這個(gè)函數(shù)將剩余的字符串存儲(chǔ)在buf變量中,而不是靜態(tài)變量中,從而保證了安全性。

      strtok_r函數(shù)

      strtok_s函數(shù)是linux下分割字符串的安全函數(shù),函數(shù)聲明如下:

      char *strtok_r(char *str, const char *delim, char **saveptr);
      

      該函數(shù)也會(huì)破壞待分解字符串的完整性,但是其將剩余的字符串保存在saveptr變量中,保證了安全性。

      拓展用例:

      linux C:

      #include <stdio.h>  
      #include <stdlib.h>  
      #include <string.h>  
        
      int main()  
      {  
          char str[]="ab,cd,ef";  
          char *ptr;  
          char *p;  
          printf("before strtok: str=%s\n",str);  
          printf("begin:\n");  
          ptr = strtok_r(str, ",", &p);  
          while(ptr != NULL){  
          // 輸出時(shí)候 str都是 ab  也會(huì)被切割  破壞待分解字符串的完整性
              printf("str=%s\n",str);  
              printf("ptr=%s\n",ptr);  
              ptr = strtok_r(NULL, ",", &p);  
          }  
          return 0;  
      }
      

      輸入結(jié)果:

      before strtok: str=ab,cd,ef 
      begin: 
      str=ab 
      ptr=ab 
      str=ab 
      ptr=cd 
      str=ab 
      ptr=ef
      

        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多