c - 使用 strtok 的段错误

标签 c char segmentation-fault strtok dereference

<分区>

尝试使用分隔符“”使用 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));

在那个点

编辑: 根据要求,编译器警告。没有在任何地方使用 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;

最佳答案

正如我在评论中发表的那样:

*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 的真正含义)。< br/>
作为对 OP 评论的回答:
write()fwrite() 处理字节,而不检查其含义,因此它们不会在 '\0' 处停止。
fprintf()fputs() 准备处理字符串,因此它们检查 '\0' 字符以停止。

关于c - 使用 strtok 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19411908/

相关文章:

c - 由于未知原因传递给函数时,数组大小正在减小

c - 为什么一个困惑的字符会打印(C)?

c++ - 有没有办法在 C++ 中将字符串文字作为引用传递

c - 段错误 : 11 when using scanf. 无法读取过去的 UUN?

c++ - 在基类指针上删除 [] 后出现段错误

c++ - 如何将opencv图像(IplImage)写入V4L2环回设备?

c - c中的隐式转换和显式转换

c - 字符数组与c中的字符串完全相同

c - char数组的声明

遍历列表时出现 C 段错误