C 从标准输入创建以null结尾的字符串数组

C 从标准输入创建以null结尾的字符串数组,c,exec,execvp,C,Exec,Execvp,我正在尝试从标准输入读入并使用execvp()中的输入 目前我收到许多警告,例如 警告:赋值使指针中的整数不带强制转换[-Wint conversion]命令[i]=NULL 警告:传递'execvp'的参数1会从整数生成指针,而不使用强制转换[-Wint conversion]execvp(commands2[0],commands2) #包括 #包括 #包括 #包括 #包括 #定义BUF_大小256 int main() { 字符缓冲区[BUF_大小]; char*命令; 字符*命令2; f

我正在尝试从标准输入读入并使用
execvp()
中的输入

目前我收到许多警告,例如

警告:赋值使指针中的整数不带强制转换[-Wint conversion]命令[i]=NULL

警告:传递'execvp'的参数1会从整数生成指针,而不使用强制转换[-Wint conversion]execvp(commands2[0],commands2)

#包括
#包括
#包括
#包括
#包括
#定义BUF_大小256
int main()
{
字符缓冲区[BUF_大小];
char*命令;
字符*命令2;
fgets(缓冲区、BUF_尺寸、标准尺寸);
commands=strtok(缓冲区“”);
printf(“%d”,命令[0]);
while(命令!=NULL)
{
printf(“%s”,命令);
commands=strtok(NULL,“”);
}
命令=realloc(命令,1);
int i=strlen(命令);
printf(“%d”,i);
命令[i]=NULL;
fgets(缓冲区、BUF_尺寸、标准尺寸);
commands2=strtok(缓冲区“”);
while(commands2!=NULL)
{
commands2=strtok(NULL,“”);
}
commands2=realloc(commands2,1);
intz=strlen(commands2);
printf(“%d”,z);
commands2[z]=NULL;
int my_管道[2];
如果(管道(我的管道)=-1)
{
perror(“无法创建管道”);
}
pid\u t我的pid;
my_pid=fork();
如果(我的pid<0)
{
perror(“失败的fork\n”);
}
如果(我的pid>0)
{
关闭(my_管道[1]);
dup2(my_管道[0],0);
关闭(my_管道[0]);
等待(空);
execvp(commands2[0],commands2);
}
其他的
{
关闭(my_管道[0]);
dup2(my_管道[1],1);
关闭(my_管道[1]);
execvp(命令[0],命令);
}
}

首先是关于使用指针的混淆。
char*命令
是一个指针(指向字符)。
命令[i]
是字符(不是指针)。
NULL
是指针(类型为
void*
,值为
0
) 因此,您不能编写
命令[i]=NULL
。 但是您可以执行
命令[i]='\0'
(值为0的字符)

然后可能会混淆
execvp()
所期望的向量。 这个向量(execvp的v)是一个指针数组(一维)。 这些指针中的每一个都是一个
字符*
、一个字符串和一个单词。 指针向量以指针NULL结尾

因此,我可以提出以下简单代码(没有fork()和pipe()):

#包括
#包括
#包括
#包括
#定义BUF_大小256
#定义最大参数256
int main(){
字符缓冲区[BUF_大小];
字符*argv[MAX_ARGS];
int argc=0;
fgets(缓冲区、BUF_尺寸、标准尺寸);
对于(argv[argc]=strtok(缓冲区“\t\n”);
argv[argc]!=NULL;
argv[++argc]=strtok(空,“\t\n”)){
printf(“argv[%d]=\%s\“\n”,argc,argv[argc]);
}
argv[argc]=NULL;
execvp(argv[0],argv);
perror(argv[0]);
退出(退出失败);
}

fgets
可以。然后,您可以使用诸如
malloc
和/或
realloc
strtok
strcpy
之类的函数。那么,您的意思是对缓冲区中的输入进行标记化并将null添加到末尾吗?这是一种方法。。。只要搜索一下,你就会发现很多例子。。。快乐编码顺便说一句:
strlen
也将是handyOkay,假设我将缓冲区标记化并将其放入
char*token
中。如何将NULL添加到令牌的末尾?你能帮我解决这个问题吗?我想上次我试这个的时候,我被卡在这一点上了。现在,你可以为你自己的代码获取帮助/答案,但我们不为你编写代码。因此,请尽最大努力编写代码,标记缓冲区,当/如果遇到问题,发布代码,描述问题,很可能有人会帮助您。
# include <stdlib.h>
# include <stdio.h>
# include <unistd.h>
# include <string.h>
# include <sys/wait.h>
# define BUF_SIZE 256
    

int main()
{
    char buffer[BUF_SIZE];
    char *commands;
    char *commands2;


    fgets(buffer, BUF_SIZE, stdin);
    commands = strtok(buffer, " ");

    printf("%d",commands[0]);
    while( commands != NULL ) 
    {
      printf( "%s", commands );
    
      commands = strtok(NULL, " ");
    }
    commands = realloc(commands,1);

    int i = strlen(commands);
    printf("%d",i);
    commands[i]=NULL;

    fgets(buffer, BUF_SIZE, stdin);
    commands2 = strtok(buffer, " ");
    
    while( commands2 != NULL ) 
    {
        commands2 = strtok(NULL, " ");
    }
    commands2 = realloc(commands2,1);
    
    int z = strlen(commands2);
    printf("%d",z);
    commands2[z]=NULL;

    int my_pipe[2];

    if (pipe(my_pipe) == -1)
    {
        perror("cannot create pipe\n");
    }

    pid_t my_pid;

    my_pid = fork();

    if (my_pid < 0)
    {
        perror("Failed fork\n");
    }

    if (my_pid > 0)
    {
        close(my_pipe[1]);
        dup2(my_pipe[0], 0);
        close(my_pipe[0]);

        wait(NULL);
        execvp(commands2[0],commands2); 
    }
    else
    {
        close(my_pipe[0]);   
        dup2(my_pipe[1], 1);
        close(my_pipe[1]);

        execvp(commands[0],commands);
    }
}
    #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>

    #define BUF_SIZE 256
    #define MAX_ARGS 256
        
    int main() {
        char buffer[BUF_SIZE];
        char *argv[MAX_ARGS];
        int argc = 0;

        fgets(buffer, BUF_SIZE, stdin);
        
        for ( argv[argc] = strtok(buffer, " \t\n"); 
              argv[argc] != NULL; 
              argv[++argc] = strtok(NULL, " \t\n") ) {
          printf("argv[%d]=\"%s\"\n", argc, argv[argc]);
        }
        argv[argc] = NULL;

        execvp(argv[0], argv); 
        
        perror(argv[0]);
        exit(EXIT_FAILURE);
    }