今天上午在写一个需求,要求的比较急,要求当天完成,我大致分析了一下,可以采用从shell脚本中插入一连串的日期,通过调用proc生成的可执行文件,将日期传入后台数据库,在数据库中进行计算。需要切分日期的字符串,转化成整数,插入int 数组中,手工实现太慢,就直接借用系统的strtok函数来用了。

场景模拟:

1. shell脚本:

  

#diao.sh
#!/bin/bash
date1="20170622,20170623,20170626,20170627,20170628,20170629,20170627"
date2="20170628,20170629,20170630" if [ $ -eq ]
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[];
char * p = NULL;
char buf2[][];
int data[];
int len = ;
int i = ;
memset(buf,0x00,sizeof(buf));
memset(buf2,0x00,sizeof(buf2));
memset(data,0x00,sizeof(data));
memcpy(buf,argc[],strlen(argc[])); 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 = ; 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[][],int * len, int data[])
{
char * p = NULL;
int i = ;
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 ;
}
int main(int argv ,char * argc[])
{
char buf[];
char * p = NULL;
char buf2[][];
int data[];
int len = ;
int i = ;
memset(buf,0x00,sizeof(buf));
memset(buf2,0x00,sizeof(buf2));
memset(data,0x00,sizeof(data));
memcpy(buf,argc[],strlen(argc[])); 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 = ; i < len ; ++i){
printf ("data[%d]=%d\n",i,data[i]);
} }

运行新的代码:

上述函数可以在任何字符串切割的场景中用到,尤其是数字字符串按照某种方式切割时。

另外一个值得注意的地方就是:shell脚本调用C程序时,main函数的参数中接受到shell脚本的参数,然后进行处理。

特别是字符串类型 char * ,字符数组 char buf[][],字符数组指针 char *p[], const char * 这些类型一定要搞清楚,之间是否可以转,怎么转,

互相之间如何赋值的,都要非常清楚。

shell脚本调用C语言之字符串切分之strtok函数的更多相关文章

  1. shell脚本调用C语言之字符串切分函数——strtok

    今天上午在写一个需求,要求的比较急,要求当天完成,我大致分析了一下,可以采用从shell脚本中插入一连串的日期,通过调用proc生成的可执行文件,将日期传入后台数据库,在数据库中进行计算.需要切分日期 ...

  2. shell中调用R语言并传入参数的两种步骤

    shell中调用R语言并传入参数的两种方法 第一种: Rscript myscript.R R脚本的输出 第二种: R CMD BATCH myscript.R # Check the output ...

  3. shell脚本调用spark-sql

    为了更方便的查询并产生报表, 需要使用shell脚本调用spark-sql spark/bin/spark-sql --master spark://host:7077 -f ${SQL_FILE} ...

  4. Shell脚本调用ftp上传文件

    Shell脚本调用ftp上传文件 1.脚本如下 ftp -n<<! open x.x.x.x ###x.x.x.x为ftp地址 user username password ###user ...

  5. Shell脚本调用SQL文格式

    Shell脚本调用SQL文格式 1. 定义需要执行的SQL文,以及需要输出文件 OUTFILE=\${DATADIR}/\${FILENAME} SQLFILE=\${DATADIR}/check_t ...

  6. Miniconda 安装 & Pip module 安装 & Shell 脚本调用 Miniconda 虚拟环境手册(实战项目应用)

    (实战项目应用) 1. 下载Miniconda 两个安装方式: 方式1:wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Min ...

  7. Shell脚本之二 变量、字符串和数组

    一.Shell 变量 1.1 定义变量 定义变量时,变量名不加美元符号($),如: your_name="runoob.com" 注意,变量名和等号之间不能有空格,这可能和你熟悉的 ...

  8. shell 脚本之获取命令输出字符串以及函数参数传递

    在ubuntu 14.04之后,所有的U盘挂载也分用户之分,最近很多操作也和U盘有关,所以就研究了一上午shell脚本函数以及字符串操作的方法. 字符串操作: 获取他的命令输出比较简单,打个简单的比方 ...

  9. shell脚本调用python脚本的路径问题

    脚本的相互调用中,只有在同一级目录下才可以使用__file__参数去获取路径名,(在shell里使用pwd也同样),否则,使用的就是主文件(最开始运行的脚本程序)的所在位置,是错误路径:一定要注意当期 ...

随机推荐

  1. Cygwin在线安装指南

    详细说明请看文章http://www.crifan.com/files/doc/docbook/cygwin_intro/release/htmls/install_cygwin_setup_exe. ...

  2. 仿淘宝左侧菜单导航栏纯Html + css 写的

    这俩天闲来没事淘宝逛了一圈看到淘宝的左侧导航菜单做的是真心的棒啊,一时兴起,查了点资料抓了几个图片仿淘宝写了个css,时间紧写的不太好,大神勿喷,给小白做个参考 废话不多说先来个效果图 接下来直接上代 ...

  3. Unity 总裁 John Riccitiello 发话:VR足以匹敌互联网

    在2017年Vision Summit大会的开幕演讲中,Unity首席执行官John Riccitiello向观众通报了开发人员如何利用Oculus,HTC等品牌创造的机遇来打造虚拟现实(VR)行业, ...

  4. eclipse 创建maven模块

    先创建一个聚合模块. 勾选Create a simple project 点击finish . 看到已经创建好了这个聚合. 接下来我们创建子模块.pay-hk  pay-web 两个字模块,前面一个是 ...

  5. 通过js来设置cookie和读取cookie,实现登陆时记住密码的功能

    function setCookie(){ //设置cookie var loginCode = $("#login_code").val(); //获取用户名信息 var pwd ...

  6. 【exp/imp】将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中

    [exp/imp]将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后 ...

  7. 使用java API操作hdfs--拷贝部分文件到本地

    要求:和前一篇的要求正好相反.. 在HDFS中生成一个130KB的文件: 代码如下: import java.io.IOException; import org.apache.hadoop.conf ...

  8. [js笔记整理]DOM 篇

    一.节点类型 1.元素节点:HTML元素 2.文本节点:元素标签中的内容 3.属性节点:元素的属性 (检测节点类型:node.nodeType //元素=1,属性=2,文本=3) 二.使用DOM获取元 ...

  9. NSA永恒之蓝病毒,如何通过360工具修复?

    简介: NSA武器库的公开被称为是网络世界"核弹危机",其中有十款影响Windows个人用户的黑客工具,包括永恒之蓝.永恒王者.永恒浪漫.永恒协作.翡翠纤维.古怪地鼠.爱斯基摩卷. ...

  10. [笔记]机器学习(Machine Learning) - 00.目录/大纲/写在之前

    目录会根据我的学习进度而更新,给自己列一个大纲以系统地看待整个学习过程. 学习资料来源 学习的是Coursera上吴恩达(Andrew Ng)老师的机器学习视频(课程传送门,最近在"最强大脑 ...