c++ - unix minishell char 转换成 **char

标签 c++ arrays pointers char

基本上我想做的是:

如果我写

Hello I am here

char command[20] 应该是 'Hello'(那部分有效)并且 char *parameters 应该有指向 ' 你好' '' '' '这里' 'NULL'。

对于“Hello”部分,我只使用了 char *com,它已经是一个指针。但我真的不知道如何正确处理其余部分。

基本上:execvp 需要一个带有命令的 char 和一个指向命令和所有参数的指针数组(我希望那部分是正确的)。

我不知道如何填写*parameters

我担心答案真的很明显:(

提前致谢

void read_command(char *com, char **par) 
{

 string Eingabe = " ";

 fprintf(stdout, "$ ");

 getline (cin, Eingabe);

 strcpy(com, Eingabe.substr(0, Eingabe.find(" ")).c_str());
 *par = com;    

 Eingabe.erase(0, Eingabe.find(" ")+1); 

  do
 {
 par++;

 strcpy( ???, Eingabe.substr(0, Eingabe.find(" ")).c_str());
 Eingabe.erase(0, Eingabe.find(" ")+1);



 }while();

return; 
}




int main()
{
 int childPid;
 int status;
 char command[20];
 char *parameters[60];

while(1) 
{

    read_command(command, parameters);

    if((childPid = fork()) == -1)
    {
     fprintf(stderr, "can't fork\n");
     exit(1);
    }else if(childPid == 0)
    {
     execvp(command, parameters);
     exit(0);
    }else
    {
    waitpid(childPid, &status, WUNTRACED | WCONTINUED);
    }
}
}

最佳答案

基本的零拷贝 C 风格实现可能如下所示:

#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main()
{
    char command[20];
    char *parameters[60];
    int i, childPid, status;

    while(1) {
        memset(command, 0, sizeof(command));
        memset(parameters, 0, sizeof(parameters));

        i = 0;

        gets(command);

        parameters[i] = strtok(command, " ");
        i++;
        while(parameters[i] = strtok(NULL, " ")) {
            //turn the space before us into a null terminator
            *(parameters[i] - 1) = '\0';
            i++;
        }

        if(childPid = fork()) { //assume success, we're the parent
            waitpid(childPid, &status, WUNTRACED | WCONTINUED);
        }
        else { //we're the child
            execvp(command, parameters);
            exit(0);
        }
    }

    return 0;
}

您正在使用 strtok 单步执行命令字符串,并在执行过程中保存每个参数的位置。 并且您正在就地修改命令字符串以将“”定界符替换为空终止符,同时将输入字符串切碎。

关于c++ - unix minishell char 转换成 **char,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36743559/

相关文章:

python - numpy 数组列表到坐标点列表的转换

c - 使指针指向数组的末尾

c++ - 'struct (*)[]' 和 'struct *[]' 有什么区别?

javascript - 使用 JS/Lodash 迭代并改变一个多维对象数组,深度未定

c# - 在 rundll32.exe 窗口中插入文本

C——目录探索

c++ - 将唯一指针指向共享指针是否可以?

c++ - 函数结束后丢失指针数据

C++ 在扩展模板类时定义特定的对象类型

c++ - 如何将 OpenGL 绘图分成类