我正在编写一个minishell,我想将我的参数存储在char **中,然后使用我的char **调用execvp函数
int main(){
char* buffer;
printf(">");
buffer = readbuff();
printf("buffer :%s\n",buffer);
exec(buffer);
//printf("buffer :%s\n",buffer);
free(buffer);
}
我在缓冲区中读取用户输入的函数
char* readbuff(){
char* buff = malloc(sizeof(char)*BUFFER_SIZE);
char* ptr = buff;
fgets(buff,BUFFER_SIZE,stdin);
int i;
for(i = 0;*ptr != '\0' && *ptr != '\n';++i){
ptr++;
}
memset(ptr,'\0',1);
return buff;
}
exec执行shell命令
void exec(char* buff){
char* ptr = buff;
char command[30];
int i = 0,j = 0;
for(i=0;*ptr != ' ';++i){
ptr++;
}
strncpy(commande,buff,i);
command[i] = '\0';
ptr++;
char* ptr2 = ptr;
while(*ptr2 != '\0'){
if(*ptr2 == ' ')
j++;
ptr2++;
}
j`将包含参数的数量
char** args = malloc(sizeof(char*)*j);
char** ptrarg = args;
for(int i = 0;i < j;i++){
*ptrarg = ptr;
while(*ptr != ' ')
ptr++;
ptr++;
ptrarg ++;
}
pid_t son = fork();
if(son == 0){ //son
execvp(command,args);
free(buff);
free(args);
}
free(args);
}
我的问题是将char *转换为char **
答案 0 :(得分:2)
输入:
char c=125;
c+=10;
printf("%d",c); //outputs -121 which is understood.
printf("%u",c); // outputs 4294967175.
printf("%u",-121); // outputs 4294967175
为char input[] = "Lorem ipsum dolor sit amet";
创建参数的步骤:
execvp()
s替换空白。创建一个5 + 1 '\0'
的数组(另外一个数组能够标记数组的结尾):
char*
将第一个单词指向第一个单词的第一个字符:
char ** ppc = malloc(6 * sizeof *ppc);
将ppc[0] = input;
的其他4个元素指向每个ppc
之后的char
通过将最后一个(附加元素)设置为'\0'
来标记数组的结尾:
NULL
像这样打电话给ppc[5] = NULL;
execvp
完整代码:
execvp(ppc[0], ppc);
答案 1 :(得分:0)
与上面的答案基本相同,执行方式略有不同。快速回答您的问题“我的问题是将char *转换为char **”=&gt;你必须创建(malloc)一个char *数组到单个char *元素的计数。然后对于char **中的每个元素,你必须使用malloc char数组并复制字符。这是在下面实现的。干杯!
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define BUFFER_SIZE 100
char* readbuff()
{
char* buff = malloc(sizeof(char)*BUFFER_SIZE);
char* ptr= buff;
memset(ptr,'\0',BUFFER_SIZE);
fgets(buff,BUFFER_SIZE,stdin);
// int i;
//for(i = 0;*ptr != '\0' && *ptr != '\n';++i){
//ptr++;
//}
//memset(ptr,'\0',1);
return buff;
}
void exec(char* buff)
{
char* ptr = buff;
char command[30];
int i = 0,j = 0;
for(i=0;*ptr != ' ';++i){
ptr++;
}
strncpy(command,buff,i);
command[i] = '\0';
//ptr++;
char* ptr2 = ptr;
ptr++;
while(*ptr2 != '\0'){
if(*ptr2 == ' ')
j++;
ptr2++;
}
char** args = malloc(sizeof(char*)*j);
//char** ptrarg = args;
int k=0;
char* ptrstart = ptr;
for(int i = 0;i < j;i++)
{
//*ptrarg = ptr;
ptrstart = ptr;
k=0;
while((*ptr != ' ') && (*ptr != '\0') )
{
k++;
++ptr;
}
args[i] = malloc(sizeof(char)*(k));
strncpy(args[i], ptrstart, k-1);
args[i][k]= '\0';
ptr++;
//ptrarg ++;
}
printf("command %s", command);
printf("args[0] %s", args[0]);
pid_t son = fork();
if(son == 0){ //son
execvp(command,args);
//free(buff);
//free(args);
}
free(args);
}
int main()
{
char* buffer;
printf(">");
buffer = readbuff();
printf("buffer :%s\n",buffer);
exec(buffer);
//printf("buffer :%s\n",buffer);
free(buffer);
}