解析进程参数

来源:互联网 发布:域账号取消挂载网络盘 编辑:程序博客网 时间:2024/06/01 09:28

在启动一个进程前,有时会给进程传一些参数,如./main 3,ps -aux等。在控制终端传参数很简单,只要输一串字符串,操作系统会给我们分解参数。现在在代码中,我们有时也会有这样的需求,用exec启动一个进程,有时会传参数给进程。我不知道有没有这样的库函数实现了这种功能,所以就自己写了一个。

#include <stdio.h>char **parse_argument(const char *args);void release_argv(char **argv);int main(){char *argument = "search -2 a.txt b.txt &";char **argv;int i = 0;argv = parse_argument(argument);while(argv[i]) {printf("%s\n",argv[i]);i++;}release_argv(argv);return 0;}/* 功能:将传给进程的整个字符串参数分解为char*型指针数组参数 * 参数:传给进程的整个字符串参数 * 返回:成功为指针数组的首地址,失败为NULL */char **parse_argument(const char *args){char **argv;const char *tiny, *temp;int size, blocks, i;argv = NULL;temp = NULL;size = i = 0;tiny = args;blocks = 0;while(*tiny != '\0') {//统计参数个数while(*tiny == ' ')//跳过开头空格tiny++;if (*tiny != '\0') {blocks++;//参数个数计数while(*tiny != ' ' && *tiny != '\0')tiny++;}}tiny = args;//分配block+1个字符串指针,最后一个存(char *)NULLif ((argv = (char **)calloc(blocks+1, sizeof(char *))) == NULL)return NULL;for (i = 0; i < blocks; i++) {while(*tiny == ' ')//跳过开头空格tiny++;if (*tiny != '\0') {size = 0;//每个参数占用的内存大小temp = tiny;while(*tiny != ' ' && *tiny != '\0') {tiny++;size++;}argv[i] = (char *)malloc(sizeof(char)*(size+1));if (argv[i] != NULL) {memset(argv[i], 0, size+1);memcpy(argv[i], temp, size);}else//分配内存失败return NULL;}}argv[blocks] = (char *)NULL;return argv;}void release_argv(char **argv){int i = 0;while(argv[i]) {free(argv[i]);i++;}free(argv);}

 

结果:

search
-2
a.txt
b.txt
&
-------------------------------

 

原创粉丝点击