在做一个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()的用法如下:
然后还是通过管道在另外一个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