shell腳本調用C語言之字符串切分函數——strtok


  今天上午在寫一個需求,要求的比較急,要求當天完成,我大致分析了一下,可以采用從shell腳本中插入一連串的日期,通過調用proc生成的可執行文件,將日期傳入后台數據庫,在數據庫中進行計算。需要切分日期的字符串,轉化成整數,插入int 數組中,手工實現太慢,就直接借用系統的strtok函數來用了。

場景模擬:

1. shell腳本:

  

#diao.sh  
#!/bin/bash
date1="20170622,20170623,20170626,20170627,20170628,20170629,20170627"
date2="20170628,20170629,20170630"

if [ $1 -eq 0 ]
        then
                compute $date1
else
                compute $date2
fi                             

2. 后台proc代碼,這里用C代碼來模擬

重點講述用strtok函數實現字符串的切分。

 

#include<string.h>
#include<stdlib.h>
#include<stdio.h>

int main(int argv ,char * argc[])
{
  char buf[100];
  char * p = NULL;
  char buf2[100][9];
  int   data[100];
  int len  = 0;
  int i = 0;
  memset(buf,0x00,sizeof(buf));
  memset(buf2,0x00,sizeof(buf2));
  memset(data,0x00,sizeof(data));
  memcpy(buf,argc[1],strlen(argc[1]));

  printf("buf=%s\n",buf);
 /* 下面代碼按照","切分字符串,然后轉化成整數,存入整數數組中*/
   p = strtok(buf, ",");              
  while( p!= NULL){  
        strcpy(buf2[len],p);
        data[len] = atoi(buf2[len]);         
        printf("buf2[%d]=%s\n",len,buf2[len]);
        len++;
        p = strtok(NULL, ",");          // 再次調用strtok函數  
    } 
  /* 上面的代碼按照","切分字符串,然后轉化成整數,存入整數數組中*/

for ( i = 0 ; i < len ; ++i){ printf ("data[%d]=%d\n",i,data[i]); } }

編譯運行情況:

 思考:將上述代碼中字符串切割,並轉化為整數,存入整數數組部分做成一個獨立的函數,進行調用,通用性一下子就上來了。

3. 將切分過程做成一個獨立的函數

函數名稱為:mystrtok,里面還是調用系統的strtok,如果直接用系統的strtok不做任何處理,是試用不了的,因為strtok出來的都是char*類型的。

#include<string.h>
#include<stdlib.h>
#include<stdio.h>
int mystrtok(char * str,const char * delim, char  buf[][9],int * len, int data[])
{
  char * p = NULL;
  int i = 0;
   p = strtok(str, delim);              
  while( p!= NULL){  
        strcpy(buf[i],p);
        data[i] = atoi(buf[i]);         
        i++;
        p = strtok(NULL, delim);          // 再次調用strtok函數  
    } 
    *len = i;
   return 0;
}
int main(int argv ,char * argc[])
{
  char buf[100];
  char * p = NULL;
  char buf2[100][9];
  int   data[100];
  int len  = 0;
  int i = 0;
  memset(buf,0x00,sizeof(buf));
  memset(buf2,0x00,sizeof(buf2));
  memset(data,0x00,sizeof(data));
  memcpy(buf,argc[1],strlen(argc[1]));
   
  printf("buf=%s\n",buf);  
 /* 下面代碼按照","切分字符串,然后轉化成整數,存入整數數組中*/
/*   p = strtok(buf, ",");              
  while( p!= NULL){  
        strcpy(buf2[len],p);
        data[len] = atoi(buf2[len]);         
        printf("buf2[%d]=%s\n",len,buf2[len]);
        len++;
        p = strtok(NULL, ",");          // 再次調用strtok函數  
    } */ 
  /* 上面的代碼按照","切分字符串,然后轉化成整數,存入整數數組中*/ 
  /* 思考,將上述代碼寫成一個獨立的函數,進行調用*/
  mystrtok(buf,",",buf2,&len,data); 
  for ( i = 0 ; i < len ; ++i){
      printf ("data[%d]=%d\n",i,data[i]);
   }
  
   
}

運行新的代碼:

上述函數可以在任何字符串切割的場景中用到,尤其是數字字符串按照某種方式切割時。

另外一個值得注意的地方就是:shell腳本調用C程序時,main函數的參數中接受到shell腳本的參數,然后進行處理。

特別是字符串類型 char * ,字符數組 char buf[][],字符數組指針 char *p[], const char * 這些類型一定要搞清楚,之間是否可以轉,怎么轉,

互相之間如何賦值的,都要非常清楚。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM