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