在C中使用strtok的结果存储在数组中

时间:2016-02-05 06:17:41

标签: c fgets

我正在尝试使用fgetsstrtok拆分输入,并将结果存储在一个数组中,即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]的存在,这有点奇怪。关于出了什么问题的任何想法?

4 个答案:

答案 0 :(得分:1)

您没有为newArgs的每个元素分配任何内存。尝试使用多维数组,如newArgs[30][100]。不要忘记确保它们被终止。

答案 1 :(得分:0)

我看到的问题:

  1. 您使用的是未初始化的char *newArgs[30]; 值。你有:

    if(newArgs[i])
    

    这是一个未初始化的指针数组。然后,你继续使用它们:

    char *newArgs[30] = {};
    

    这是未定义行为的原因。您可以通过将指针初始化为NULL来解决此问题。

    newArgs[i]
  2. 在致电

    之前,您尚未为sprintf(newArgs[i], "%s", token); 分配内存
    newArgs[i] = strdup(token);
    

    这也是未定义行为的原因。您可以使用以下方法解决此问题:

    execvp
  3. 传递给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未在execvpexecvp未返回之前修改。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的位置。