今天上午在写一个需求,要求的比较急,要求当天完成,我大致分析了一下,可以采用从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 脚本之获取命令输出字符串以及函数参数传递

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

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

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

  4. shell脚本调用spark-sql

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

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

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

  6. Shell脚本调用SQL文格式

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

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

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

  8. C语言之字符串处理函数

    C语言中字符串处理函数介绍 下面介绍8种基本的常用的字符串处理函数,在数值数组中也常常用到(部分函数).所有的C语言编译系统中一般都提供这些函数. 1.puts函数——输出字符串的函数 一般的形式为p ...

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

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

随机推荐

  1. livereload使用方法

    搞这个自动刷新的插件搞了好几个小时了还没搞明白,快被气死了,想改用browser-sync结果npm又一直转啊转一直卡死. 刚才终于神奇地搞定了,结果发现还是我自己智商太低...大概的经过是这样的.. ...

  2. js调试系列: 初识控制台

    写在最开头:其实我以前就在考虑要不要写这个东西,因为这个东西确实不难,但是为什么会有这么多人问,他们问的不是怎么用控制台,而是不知道控制台能干嘛,他们也知道有 console.log 之类的东西,但他 ...

  3. ASP.net 控件实现数据级联

    今天我们来一起用ASP.net实现一个级联,这个小不点应该是会经常用到的的. 咱们简单的画两个窗体.文本框会根据下拉框所选的内容显示不同的内容. 具体实现效果如下 步骤一: 准备工作,建立相应的数据库 ...

  4. java CountDownLatch的使用

    CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行.使用一个计数器进行实现.计数器初始值为线程的数量.当每一个线程完成自己任务后,计数器的值就会减一.当计数器的值 ...

  5. header()跳转

    if ($toNews == 1) { header('Location:/ucenter/pageMailBox/2'); exit; } PHP跳转页面,用 header() 函数 定义和用法 h ...

  6. Zookeeper命名服务——生成分布式有序且唯一id

    生成分布式有序且唯一id的方法有很多种,使用zookeeper是比较简单的一种方法,只是生成的速度不高,这里只是一个借助zk的版本号生成分布式唯一且有序id的例子. ZkIdGenerator.jav ...

  7. bash脚本:集群资源争夺战crazy-killer

    背景 公司的集群很多人一起用,有时候就难免资源紧张,某次需要用的时候没资源等了半天还是没资源,再等半天还是没资源,于是就写了个脚本泄愤,建议看到的人拷走放在自己公司集群上长期运行 :) 实现 此脚本运 ...

  8. Java内存模型-volatile的内存语义

    一 引言 听说在Java 5之前volatile关键字备受争议,所以本文也不讨论1.5版本之前的volatile.本文主要针对1.5后即JSR-133针对volatile做了强化后的了解. 二 vol ...

  9. Linux环境下FTP工具的使用方法

    在Windows环境下创建Ftp目录作为服务器根目录 在Linux端的操作: 从服务器端下载文件到Linux端: ftpget -u User -p Password ServerIP File Fi ...

  10. python中的*号

    from:https://www.douban.com/note/231603832/ 传递实参和定义形参(所谓实参就是调用函数时传入的参数,形参则是定义函数是定义的参数)的时候,你还可以使用两个特殊 ...