C语言 linux 怎么样构造满足execv()的以NULL结尾的字符串数组参数表

C语言 码拜 8年前 (2016-04-26) 1441次浏览
在做一个shell命令解释器(别问为什么~作业。)
然后还是通过管道在另外一个terminal里面传递指令和参数。
这些不是关键

下面是问题描述:
本人获得一个字符串,通过strtok()函数切割字符串,得到一个个分散的字符串,组成了字符串数组argv[n][MAX_SIZE]。
例如:本人获得:”cat hello.c hello_world.c”,处理后得到:argv[0]=”cat” , argv[1]=”hello.c” , argv[2]=”hello_world.c”
接下来,本人通过fork()函数和execv()函数来实现子进程的产生。
execv()的用法如下:

int execv(const char *pathname, char * const argv[]);

这里的关键是:argv这个字符串数组要以NULL结尾。
(1)假如本人将本人上面得到的argv传过去,编译通过,但运行会出现错误提示:Bad address,并且无法调用execv()。
(2)假如本人重新申请一个字符串数组,并作如下赋值:

char argv_1[args][MAX_SIZE];                //其中args是前面参数分割后的个数,已知。
int i=0;
while(i<args)
{
        strcpy(argv_1[i],argv[1]);
        i++;
}
argv_1[args]=NULL;                
//这里假如加上这句,编译不能通过。
//假如改为 strcpy(argv_1[args],NULL);
//编译能通过,但是运行出现段错误(segmentation fault)
//然后错误退出。

(3)假如本人本人做一个参数表如下:

char *argv[]={"cat","hello.c","hello_world.c",NULL};
execv(argv[0],argv);

这样就是正常的,而且能达到预期结果。
问题是,本人的参数个数是不定的,那本人怎么样构造满足要求(后面以NULL结尾)的字符串数组作为参数表?
P.S.:小弟本人C语言学得并不深入,可能上面有低级错误,往大家指正~谢谢~

解决方案

60

char argv_1[args][MAX_SIZE];                //其中args是前面参数分割后的个数,已知。
int i=0;
while(i<args)
{
        strcpy(argv_1[i],argv[1]);
        i++;
}
argv_1[args]=NULL;      //此处改成argv_1[i] = NULL; 

40

malloc、realloc、free

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C语言 linux 怎么样构造满足execv()的以NULL结尾的字符串数组参数表
喜欢 (1)
[1034331897@qq.com]
分享 (0)