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

Create an array of null-terminated strings from standard input

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

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

警告:赋值从指针生成整数而不进行强制转换 [-Wint-conversion] 命令[i]=NULL;

警告:传递‘execvp’的参数 1 使指针来自整数而不进行强制转换 [-Wint-conversion] execvp(commands2[0],commands2);

# 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);
    }
}

首先是对指针的使用感到困惑。 char *commands 是一个指针(指向一个字符)。 commands[i] 是一个字符(不是指针)。 NULL 是一个指针(类型 void *,值 0) 所以,你不能写commands[i]=NULL。 但是你可以做 commands[i]='[=17=]' (值 0 的字符)。

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

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

    #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);
    }