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));

の時点で

編集: 要求に応じて、コンパイラの警告。どこにも 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

コマンドは文字列リテラルで、ROM にあります。memcpy() を使用してローカル変数にコピーし、strtok() で使用します。

于 2013-10-16T19:50:25.497 に答える