今天上午在写一个需求,要求的比较急,要求当天完成,我大致分析了一下,可以采用从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. uoj#228 基础数据结构练习题

    题面:http://uoj.ac/problem/228 正解:线段树. 我们可以发现,开根号时一个区间中的数总是趋近相等.判断一个区间的数是否相等,只要判断最大值和最小值是否相等就行了.如果这个区间 ...

  2. 【DP系列学习一】简单题:kickstart2017 B.vote

    https://code.google.com/codejam/contest/6304486/dashboard#s=p1 这是一道简单的dp,dp[i][j]代表A的voter为i,B的voter ...

  3. 阿里云CentOS7.2服务器的安装

    第一步:下载服务器系统ISO安装文件 我使用的是阿里云的镜像:因为阿里云的服务在国内相对比较成熟 服务器镜像下载如下:http://mirrors.aliyun.com/centos/7/isos/x ...

  4. 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10的100次幂。 输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1 空格,但一行中最后一个拼音数字后没有空格。 输入样例: 1234567890987654321123456789 输出样例: yi san wu

    这是PAT中的一道练习题 刚开始的时候我想着直接定义正整数n,结果走了很大的弯路,因为题目中要求n小于10的100次幂,即最大的正整数n有100位,而C语言中整型数字最大占8个字节的存储空间,如果按无 ...

  5. jQuery的hover方法搭配css的hover选择器,实现选中元素突出显示

    问题简述: 今天做帮一个师姐做网页遇到一个这样的要求: 鼠标不移动进表格,表格透明度不变. 鼠标移动进表格,hover到的单元格透明度不变,没hover到的单元格透明度改变. 先贴我已经实现好的效果, ...

  6. Thinkphp3.2———配置模块

    一.配置格式 Thinkphp框架中的所有配置都是数组形式定义的的格式为: //项目配置 return array( 'DEFAULT_MODULE'=>'Index',//默认模块 'URL_ ...

  7. Python之返回函数

    高阶函数可以把函数作为一个结果值返回 举例说明 普通的求积函数是 vim day5-6.py #!/usr/bin/python # -*- coding:utf-8 -*- def product( ...

  8. vue.js应用开发笔记

    看vue.js有几天了,之前也零零散散的瞅过,不过一直没有动手去写过demo,这几天后台事比较少,一直在讨论各种需求(其实公司对需求还是比较重视与严谨的,一个项目需求讨论就差不多一周了,这要搁之前,天 ...

  9. CompletionService 简介

    以下是jdk关于CompletionService的简介: public interface CompletionService<V> 将生产新的异步任务与使用已完成任务的结果分离开来的服 ...

  10. 一个小博客教你把vim用飞起来

    引言 今天我们特地来讲讲这个vim的配置. vim这东西, 很多人装逼的时候经常会提到, 不过大部分人对个vim的配置还是很陌生的, 因为 这个编辑器的学习成本还是有点高的, 但是不要紧, 今天我们就 ...