在C中创建一个子数组或切片,但不包含最后一个元素

在C中创建一个子数组或切片,但不包含最后一个元素,c,unix,C,Unix,我正试图用C写一个shell 例如,我成功地将用户输入处理并解析到数组中。如果用户输入ls-al,它将被解析为|ls | al |\0 | 这个微型外壳的一个要求是能够使用fork()和execvp(或另一个exec函数)来分叉和执行进程,并且能够在用户输入和符号时对进程进行后台处理 系统调用需要2个参数: 字符数组指针(ahem,string),其中包含要执行的文件名(这将是我解析的数组的第一个元素) 要传递给正在执行的程序的参数char数组 这里是一个问题,如何从我创建的参数数组创建子数组,

我正试图用C写一个shell

例如,我成功地将用户输入处理并解析到数组中。如果用户输入
ls-al
,它将被解析为
|ls | al |\0 |

这个微型外壳的一个要求是能够使用
fork()
execvp
(或另一个
exec
函数)来分叉和执行进程,并且能够在用户输入
符号时对进程进行后台处理

系统调用需要2个参数:

  • 字符数组指针(ahem,string),其中包含要执行的文件名(这将是我解析的数组的第一个元素)
  • 要传递给正在执行的程序的参数char数组
  • 这里是一个问题,如何从我创建的参数数组创建子数组,而不使用数组中的最后一个元素?即如果用户在
    ls-al&
    中键入,我的shell将生成一个
    | ls | al |和|
    数组,我需要只传递一个
    | al |
    的argv数组,而不传递
    |&|

    根据我使用C的经验和我所发现的,如果我不想要数组的第一个元素,比如
    char**subArray=&argv[1]
    ,或者使用
    memcpy
    (),它允许在没有前n个元素的情况下创建子数组,但不能没有最后一个元素

    但是删除最后一个元素是for循环还是while循环的唯一方法?在没有最后一个元素的情况下创建新数组


    我还尝试将
    &
    所在的最后一个元素设置为
    NULL
    \0
    ,但execvp不允许传入具有NULL值的数组(它会使程序崩溃)。这可以按预期工作。但实际上不会创建子数组或其指针


    我正在寻找的一个相关概念可能是其他语言中的数组切片,我认为这在C语言中不存在。

    函数的
    exec
    家族并不像大多数程序员所期望的那样工作

    第一个参数有可执行文件路径。第二个参数也应该是文件路径(或仅文件名部分)。第三个参数是第一个参数,依此类推

    对于execvp风格,参数数组仍然必须具有可执行文件路径的第一个入口点


    您不需要执行任何切片操作:只需在数组中最后一个参数指针后加一个NULL。

    exec的函数族并不像大多数程序员所期望的那样工作

    第一个参数有可执行文件路径。第二个参数也应该是文件路径(或仅文件名部分)。第三个参数是第一个参数,依此类推

    对于execvp风格,参数数组仍然必须具有可执行文件路径的第一个入口点


    您不需要执行任何切片操作:只需在数组中最后一个参数指针后加一个NULL。

    exec的函数族并不像大多数程序员所期望的那样工作

    第一个参数有可执行文件路径。第二个参数也应该是文件路径(或仅文件名部分)。第三个参数是第一个参数,依此类推

    对于execvp风格,参数数组仍然必须具有可执行文件路径的第一个入口点


    您不需要执行任何切片操作:只需在数组中最后一个参数指针后加一个NULL。

    exec的函数族并不像大多数程序员所期望的那样工作

    第一个参数有可执行文件路径。第二个参数也应该是文件路径(或仅文件名部分)。第三个参数是第一个参数,依此类推

    对于execvp风格,参数数组仍然必须具有可执行文件路径的第一个入口点


    您不需要执行任何切片操作:只需在数组中最后一个参数指针后放置一个NULL。

    只需将最后一个参数设置为NULL即可

    argv[argc-1] = NULL;
    execvep(cmd, args);
    

    只需将最后一个参数设为null

    argv[argc-1] = NULL;
    execvep(cmd, args);
    

    只需将最后一个参数设为null

    argv[argc-1] = NULL;
    execvep(cmd, args);
    

    只需将最后一个参数设为null

    argv[argc-1] = NULL;
    execvep(cmd, args);
    

    您无需执行任何操作。动态构造的C数组只是指向其第一个元素的指针,其他元素位于正确的位置。包含“1”、“2”、“3”的数组也已经是包含“1”、“2”的数组以及仅包含“1”的数组


    在exec函数的情况下,它们需要一个数组,其最后一个条目为NULL(这就是它们如何确定哪个条目是最后一个条目的方法)。因此,要将
    {1”,“2”,“3”}
    转换为
    {1”,“2”,NULL}
    ,只需将第三个条目设置为NULL。

    无需执行任何操作。动态构造的C数组只是指向其第一个元素的指针,其他元素位于正确的位置。包含“1”、“2”、“3”的数组也已经是包含“1”、“2”和仅包含“1”的数组


    在exec函数的情况下,它们需要一个数组,其最后一个条目为NULL(这就是它们如何确定哪个条目是最后一个条目的方法)。因此,要将
    {1”,“2”,“3”}
    转换为
    {1”,“2”,NULL}
    ,只需将第三个条目设置为NULL。

    无需执行任何操作。动态构造的C数组只是指向其第一个元素的指针,其他元素位于正确的位置。包含“1”、“2”、“3”的数组也已经是包含“1”、“2”和仅包含“1”的数组


    在exec函数的情况下,它们需要一个数组,其最后一个条目为NULL(这就是它们如何确定哪个条目是最后一个条目的方法)。因此,要将
    {1”,“2”,“3”}
    转换为
    {1”,“2”,NULL}
    ,只需将第三个条目设置为NULL。

    无需执行任何操作。动态构造的C数组只是指向其