如何在char **中存储几个单独的字符串以使用execvp?

时间:2017-12-10 14:06:09

标签: c linux shell

我正在编写一个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 **

2 个答案:

答案 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"; 创建参数的步骤:

  • 算上空白:5
  • 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);
}