在启动一个进程前,有时会给进程传一些参数,如./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 *)NULL
if ((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
&
-------------------------------