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 [ $ -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的更多相关文章
- shell脚本调用C语言之字符串切分之strtok函数
今天上午在写一个需求,要求的比较急,要求当天完成,我大致分析了一下,可以采用从shell脚本中插入一连串的日期,通过调用proc生成的可执行文件,将日期传入后台数据库,在数据库中进行计算.需要切分日期 ...
- shell 脚本之获取命令输出字符串以及函数参数传递
在ubuntu 14.04之后,所有的U盘挂载也分用户之分,最近很多操作也和U盘有关,所以就研究了一上午shell脚本函数以及字符串操作的方法. 字符串操作: 获取他的命令输出比较简单,打个简单的比方 ...
- shell中调用R语言并传入参数的两种步骤
shell中调用R语言并传入参数的两种方法 第一种: Rscript myscript.R R脚本的输出 第二种: R CMD BATCH myscript.R # Check the output ...
- shell脚本调用spark-sql
为了更方便的查询并产生报表, 需要使用shell脚本调用spark-sql spark/bin/spark-sql --master spark://host:7077 -f ${SQL_FILE} ...
- Shell脚本调用ftp上传文件
Shell脚本调用ftp上传文件 1.脚本如下 ftp -n<<! open x.x.x.x ###x.x.x.x为ftp地址 user username password ###user ...
- Shell脚本调用SQL文格式
Shell脚本调用SQL文格式 1. 定义需要执行的SQL文,以及需要输出文件 OUTFILE=\${DATADIR}/\${FILENAME} SQLFILE=\${DATADIR}/check_t ...
- Miniconda 安装 & Pip module 安装 & Shell 脚本调用 Miniconda 虚拟环境手册(实战项目应用)
(实战项目应用) 1. 下载Miniconda 两个安装方式: 方式1:wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Min ...
- C语言之字符串处理函数
C语言中字符串处理函数介绍 下面介绍8种基本的常用的字符串处理函数,在数值数组中也常常用到(部分函数).所有的C语言编译系统中一般都提供这些函数. 1.puts函数——输出字符串的函数 一般的形式为p ...
- Shell脚本之二 变量、字符串和数组
一.Shell 变量 1.1 定义变量 定义变量时,变量名不加美元符号($),如: your_name="runoob.com" 注意,变量名和等号之间不能有空格,这可能和你熟悉的 ...
随机推荐
- Flex 自定义 Zlert 组件!
说明: 原生的 Alert.show 参数,要显示的按钮你只能 Alert.OK | Alert.Cancel 这样; 自定义 Zlert 参数跟原生的 差不多,按钮写法是这样写的: {"b ...
- js和jquery使按钮失效为不可用状态的方法
设置disabled属性为true即为不可用状态. html代码: <input type="button" value="提交" id="bt ...
- 第7月第11天 AVAsset
1. An AVAsset defines the collective properties of the tracks that comprise the asset. (You can acce ...
- 第6月第17天 CGAffineTransformMake(a,b,c,d,tx,ty) 矩阵运算的原理
1. 为了把二维图形的变化统一在一个坐标系里,引入了齐次坐标的概念,即把一个图形用一个三维矩阵表示,其中第三列总是(0,0,1),用来作为坐标系的标准.所以所有的变化都由前两列完成. 以上参数在矩阵中 ...
- ListView position
在使用listview的时候,我们经常会在listview的监听事件中,例如OnItemClickListener(onItemClick)中,或listview的adapter中(getView.g ...
- Servlet笔记11--补充
Servlet线程安全问题: 代码示例: package com.bjpowernode.javaweb.servlet; import java.io.IOException; import jav ...
- Java练习之使用StringBuilder
package string.demo; /* * 将数组变为字符串输出 */ public class StringBuilderTest { /** * @param args */ public ...
- pytorch函数之torch.normal()
Returns a Tensor of random numbers drawn from separate normal distributions who’s mean and standard ...
- sublime sftp 打开远程文件夹
2014-04-29 13:19:09 总结: 本文介绍两种方法,推荐第二种方法(samba+windows映射) 先贴出sublime打开远程(Linux)目录所需的配置文件(sublime是通过s ...
- Python_oldboy_自动化运维之路_线程,进程,协程(十一)
本节内容: 线程 进程 协程 IO多路复用 自定义异步非阻塞的框架 线程和进程的介绍: 举个例子,拿甄嬛传举列线程和进程的关系: 总结:1.工作最小单元是线程,进程说白了就是提供资源的 2.一个应用程 ...