0

尝试使用 strtok 使用分隔符“”拆分字符串,但出现分段错误。

    char command[12];
    char *instruction;
    char *parameter_1;
    char *parameter_2;
    *instruction = strtok(command, " ,.-");
    *parameter_1 = strtok(NULL, " ,.-");
    *parameter_2 = strtok(NULL, " ,.-");
    write(1,parameter_1,sizeof(parameter_1));

在 th 点

编辑:根据要求,编译器警告。没有在任何地方使用 int ,所以很困惑。

shell.c:51:16: warning: assignment makes integer from pointer without a cast [enabled by default]
shell.c:52:16: warning: assignment makes integer from pointer without a cast [enabled by default]
shell.c:53:16: warning: assignment makes integer from pointer without a cast [enabled by default]

Command: abd def ghj
Segmentation fault (core dumped)

编辑2:

int prompt() {
    // Get Input
    char inputData[256];
    int rid;
    rid = read(0,inputData,256);

    // Strip input
    char command[rid];
    int i;
    for (i = 0; i<=rid-2; i++) {
        command[i] = inputData[i];
    }
    command[rid-1] = '\0';

    // Debug
    //  printf("\n-%c-%i\n",command[10],(int)sizeof(command));
    //  write(1,command,sizeof(command));

    if (strcmp(command, "exit") == 0) {
        break;
    }

    char *instruction;
    char *parameter_1;
    char *parameter_2;
    instruction = strtok(command, " ");
    parameter_1 = strtok(NULL, " ");
    parameter_2 = strtok(NULL, " ");
    write(1,instruction,sizeof(instruction));
    //write(1,parameter_2,sizeof(parameter_2));
}

return 0;

}

4

3 回答 3

2

正如我在评论中发布的:

*instruction = strtok(command, " ,.-");
*parameter_1 = strtok(NULL, " ,.-");
*parameter_2 = strtok(NULL, " ,.-");

应该替换为

instruction = strtok(command, " ,.-");
parameter_1 = strtok(NULL, " ,.-");
parameter_2 = strtok(NULL, " ,.-");

sizeof(instruction)不会返回您机器上的字符数(它不是数组),而是指向 char 的指针的大小(这就是指令,param_1,param_2 的真正含义)。

作为对 OP 评论的回答:
write()fwrite()处理字节,而不检查其含义,因此它们不会停在'\0'.
fprintf(),fputs()准备在字符串上工作,所以他们检查'\0'char 是否停止。

于 2013-10-16T19:44:40.120 回答
1

修复如下:

char command[12];
char *instruction;
char *parameter_1;
char *parameter_2;
instruction = strtok(command, " ,.-");
parameter_1 = strtok(NULL, " ,.-");
parameter_2 = strtok(NULL, " ,.-");
write(1,parameter_1,sizeof(parameter_1));

(删除*)

于 2013-10-16T19:34:05.433 回答
0

command 是一个字符串文字,它在 ROM 中。可能使用 memcpy() 将其复制到局部变量,然后在 strtok() 中使用它。

于 2013-10-16T19:50:25.497 回答