Thread: converting a vector of strings into an array.

  1. #1
    Registered User
    Join Date
    Sep 2005
    Posts
    41

    converting a vector of strings into an array.

    Code:
    vector<string> left_args;
     
    //left_comm_toks is a vector that stores strings.
    // GetNumTokens returns the size of the left_com_toks vector
    for(int i = 0; i < left_comm_toks.GetNumTokens(); i++)
    {
       left_args.push_back(left_comm_toks[i]);
    }
     
    vector<char *> left_argv;
     
    // loop restores the vector with the same elements but diff type
    for(int i = 0; i < left_args.size(); i++)
       left_argv.push_back(const_cast<char *>(left_args[i].c_str()));
     
     
    close(p[0]);
    dup2(p[1], 1);
    close(p[1]);
    //argv[2] = 0;
    execvp(arg0, left_argv);  // get error right here left_arg is not the type that execvp wants
    cerr << "Error on exec of " << arg0 << ": " << strerror(errno) << endl;
    _exit(errno == ENOENT ? 127 : 126);
    The above code of course does not work. What i think i need to do is copy the left_argv vector into a array so that execvp can use it. How can I go about doing this? Is there a way to cast the vector or something so i dont have to recopy into an array?

    PS, this is not the whole code I just posted the part that is giving me trouble, the rest of the program works. Here is the WHOLE function just in case you need it.

    Code:
    void execute_command(string left_command, string right_command)
    {
       //char *argv[] = {"ls", "ls", 0};
       //char *left_arg[] = {"ls", 0};
       //char *right_arg[] = {"grep", "main", 0};
       int p[2];
       int pid;
       int len, len2;
       ParsedTokens left_comm_toks;
       ParsedTokens right_comm_toks;
          
       // int pipe(int filedes[2]);
       // filedes[0] is for reading, filedes[1] is for writing
       if(pipe(p) < 0)
       {
          cerr << strerror(errno) << endl;
          exit(EXIT_FAILURE);
       }
    
       pid = fork();
       if(pid < 0)
       {
          cerr << strerror(errno) << endl;
          exit(EXIT_FAILURE);
       }
       if(pid == 0)
       {
          cout << "exec left arg" << endl;
    	  char * tempstring;
    	  tempstring = new char[left_command.length() + 1];
    	  strcpy(tempstring, left_command.c_str());
    	  left_comm_toks.ParseAndAddTokens(tempstring);
    	  len = left_comm_toks[0].length();
    	  const char * arg0 = left_comm_toks[0].c_str();
    	  // converts left_command into left_argv[] which execvp uses
    	  /*len = left_command.length();
    	  char * const myArr = new char[len + 1];
    	  for(int x = 0; x < len; x++)
    	     myArr[x] = left_command[x];
    	  myArr[len] = '\0';
    	  char * const left_argv[] = {myArr,0};*/
    
          vector<string> left_args;
    
          for(int i = 0; i < left_comm_toks.GetNumTokens(); i++)
          {
             left_args.push_back(left_comm_toks[i]);
          }
    
          vector<char *> left_argv;
    
          for(int i = 0; i < left_args.size(); i ++)
             left_argv.push_back(const_cast<char *>(left_args[i].c_str()));
    
          close(p[0]);
          dup2(p[1], 1);
          close(p[1]);
          execvp(arg0, left_argv); 
          cerr << "Error on exec of " << arg0 << ": " << strerror(errno) << endl;
          _exit(errno == ENOENT ? 127 : 126);
    
       }
    
       // do the same thing except for the right command
       pid = fork();
       if(pid < 0)
       {
          cerr << strerror(errno) << endl;
          exit(EXIT_FAILURE);
       }
       if(pid == 0)
       {
          cout << "executing right command" << endl;
          // converts left_command into left_argv[] which execvp uses
    	  len2 = right_command.length();
    	  char * const myArr2 = new char[len +1];
    	  for(int x = 0; x < len2; x++)
    	     myArr2[x] = right_command[x];
    	   myArr2[len2] = '\0';
    
    	  char *const right_argv[] = {myArr2, 0};
    
    	  close(p[1]);
    	  dup2(p[0], 0);
          close(p[0]);
          execvp(right_argv[0], right_argv);
          cerr << "Error on exec of " << right_argv[0] << ": " << strerror(errno) << endl;
          _exit(errno == ENOENT ? 127 : 126);
       }
       close(p[0]);
       close(p[1]);
    
       wait(0);
       wait(0);
       
    }

  2. #2
    Code Goddess Prelude's Avatar
    Join Date
    Sep 2001
    Posts
    9,897
    This is a nifty trick that the C++ standard guarantees will work:
    Code:
    execvp(arg0, &left_argv[0]);
    My best code is written with the delete key.

  3. #3
    Registered User
    Join Date
    Sep 2005
    Posts
    41
    thanks a bunch. everything works now!

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Replies: 1
    Last Post: 03-19-2009, 10:56 AM
  2. Swapping strings in an array of strings
    By dannyzimbabwe in forum C Programming
    Replies: 3
    Last Post: 03-03-2009, 12:28 PM
  3. Concatenating strings (dynamic array using pointers)
    By Tankndozer in forum C Programming
    Replies: 8
    Last Post: 07-01-2004, 07:27 AM
  4. declaring array of strings dynamically!!!!
    By Real in forum C Programming
    Replies: 1
    Last Post: 08-29-2003, 06:59 AM
  5. Array of Strings
    By mjpars in forum C Programming
    Replies: 8
    Last Post: 08-21-2003, 11:15 PM