gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:17:19 25 4
gpt4 key购买 nike

基本上我想做的是:

如果我写

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com