當前位置:
首頁 > 知識 > shell腳本調用C語言之字元串切分函數——strtok

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
~

2. 後台proc代碼,這裡用C代碼來模擬,重點講述用strtok函數實現字元串的切分。

#include
#include
#include

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
",buf);
/* 下面代碼按照","切分字元串,然後轉化成整數,存入整數數組中*/
p = strtok(buf, ",");
while( p!= NULL){
strcpy(buf2[len],p);
data[len] = atoi(buf2[len]);
printf("buf2[%d]=%s
",len,buf2[len]);
len++;
p = strtok(NULL, ","); // 再次調用strtok函數
}
/* 上面的代碼按照","切分字元串,然後轉化成整數,存入整數數組中*/

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

編譯運行情況:

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

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

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

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

#include
#include
#include
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
",buf);
/* 下面代碼按照","切分字元串,然後轉化成整數,存入整數數組中*/
/* p = strtok(buf, ",");
while( p!= NULL){
strcpy(buf2[len],p);
data[len] = atoi(buf2[len]);
printf("buf2[%d]=%s
",len,buf2[len]);
len++;
p = strtok(NULL, ","); // 再次調用strtok函數
} */
/* 上面的代碼按照","切分字元串,然後轉化成整數,存入整數數組中*/
/* 思考,將上述代碼寫成一個獨立的函數,進行調用*/
mystrtok(buf,",",buf2,&len,data);
for ( i = 0 ; i < len ; ++i){ printf ("data[%d]=%d ",i,data[i]); } }

運行新的代碼:

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

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

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

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

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

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 達人科技 的精彩文章:

一道C語言安全編碼題目
Asp.net MVC 如何對所有用戶輸入的字元串欄位做Trim處理
並行模式庫PPL應用實戰(一):使用task類創建並行任務

TAG:達人科技 |

您可能感興趣

使用redis來調用iptables,封禁惡意IP
使用 python 調用 echart 畫圖
通過調用Windows命令,將chm 文件轉換為html 文件
necp_client_action系統調用中的堆溢出漏洞分析
SpringCloud之服務提供與調用(Ribbon,Feign)
OpenCV調用TensorFlow是什麼意思
Asp.Net Core使用SignalR進行服務間調用
Flutter調用平台代碼
關於如何使用webpack命令行傳入變數,並通過process.env來調用
加入Transformer-XL,這個PyTorch包能調用各種NLP預訓練模型
python調用api介面
jQuery UI 小部件(Widget)方法調用
c井動態調用WebService
Alexa應用開發者將可免費調用8種Amazon Polly自然語音
如何用Ptrace攔截並模擬Linux系統調用
C/C++ 使用 TensorFlow 預訓練好模型——間接調用 Python 實現
Python 調用 Micro 宏自動解析 Nmon 文件進行數據歸檔
python訓練mask rcnn模型&&C++調用訓練好的模型——基於opencv4.0
跨域Iframe腳本調用
透過現象看原理:詳解 Spring 中 Bean 的 this 調用導致 AOP 失效的原因