在啓動一個進程前,有時會給進程傳一些參數,如./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
&
-------------------------------