我正在尝试使用fgets
从strtok
拆分输入,并将结果存储在一个数组中,即newArgs
,这样我就可以调用execvp
和基本上执行fgets
传递的输入。
E.g。 ls -la
将映射到/bin/ls -la
并正确执行。
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char * argv[])
{
char buff[1024];
fgets(buff, 1024, stdin);
buff[strcspn(buff, "\n")] = 0;
printf("%s\n", buff);
printf("%d\n", strlen(buff));
char *newArgs[30];
char *token;
char delim[2] = " ";
token = strtok(buff, delim);
int i = 0;
while(token != NULL)
{
if(newArgs[i])
{
sprintf(newArgs[i], "%s", token);
printf("%s\n", newArgs[i]);
}
token = strtok(NULL, delim);
i++;
}
execvp(newArgs[0], newArgs);
return 0;
}
我一直在收到Segmentation错误,即使我正在检查newArgs[i]
的存在,这有点奇怪。关于出了什么问题的任何想法?
答案 0 :(得分:1)
您没有为newArgs
的每个元素分配任何内存。尝试使用多维数组,如newArgs[30][100]
。不要忘记确保它们被终止。
答案 1 :(得分:0)
我看到的问题:
您使用的是未初始化的char *newArgs[30];
值。你有:
if(newArgs[i])
这是一个未初始化的指针数组。然后,你继续使用它们:
char *newArgs[30] = {};
这是未定义行为的原因。您可以通过将指针初始化为NULL来解决此问题。
newArgs[i]
在致电
之前,您尚未为sprintf(newArgs[i], "%s", token);
分配内存
newArgs[i] = strdup(token);
这也是未定义行为的原因。您可以使用以下方法解决此问题:
execvp
传递给execv()
的参数列表必须包含NULL指针。
来自here(强调我的):
execvp()
,execvpe()
和newArgs
函数提供了一系列指针以null结尾的字符串,表示新程序可用的参数列表。按照惯例,第一个参数应指向与正在执行的文件关联的文件名。 指针数组必须以NULL指针终止。
您错过了最后一项要求。您需要确保Test-WSMan -ComputerName "My DNS" -UseSSL
的其中一个元素是NULL指针。如果将指针初始化为NULL,则此问题将消失。
答案 2 :(得分:0)
在将{1}}存储在字符串中之前,您没有为newArgs
分配内存。
添加
newArgs[i] = malloc(strlen(token));
在if
循环内的for
语句之前。
答案 3 :(得分:0)
绝对没有理由复制您在buff
中找到的令牌。
情况并非总是如此,但肯定在这里:buff
未在execvp
和execvp
未返回之前修改。execvp
知道何时不复制C字符串不如知道如何复制C字符串那么有用,但两者都很重要。
不复制字符串会大大简化代码。您需要做的就是填写您将传递给 char* args[30]; /* Think about dynamic allocation instead */
char** arg = &args[0];
*arg = strtok(buff, " ");
while (*arg++) {
/* Should check for overflow of the args array */
*arg = strtok(NULL, " ");
}
execvp(args[0], args);
的字符串数组:
strtok
请注意,上面的代码会将args
返回的NULL存储在execvp
数组的末尾。这是<?php
$thumb_id = 25;
$url = wp_get_attachment_thumb_url( $thumb_id );
?>
<img src="<?php echo $url ?>"/>
所必需的,它需要知道最后一个arg的位置。