0

私は自分のシェルプログラムを作成しようとしていて、私が見ているチュートリアルはstrtok()関数の使用をアドバイスしています。ただし、コマンドラインを解析するだけではうまくいかず、何が間違っているのかわかりません。parseCmd()関数内でstrtok()を最初に使用しているときに、セグメンテーション違反が発生し続けます。

これまでの私のコードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

#define MAXSIZE 512

int parseCmd(char *cmd, char *args[])
{
    printf("LOGGER: parseCmd(cmd=%s, args=%p)\n", cmd, args);

    char cmdDelims[] = " >";

    char *cmdReader;
    cmdReader = strtok(cmd, cmdDelims);

    printf("LOGGER: cmdReader=%s\n", cmdReader);

    int i = 0;
    while (cmd != NULL)
    {
        printf("LOGGER: %d counter", i);

        args[i] = strdup(cmdReader);
        cmdReader = strtok(NULL, " >");
        i++;
    }
}

int main() 
{   
    char *in;
    in = malloc(MAXSIZE);

    char *args[10];
    char *cmd = NULL;

    int errorBit = 0;
    int terminationBit = 1;

    char inDelims[] = "\n";

    while (terminationBit)
    {
        printf("mysh>");
        fgets(in, MAXSIZE, stdin);

        cmd = strtok(in, inDelims);

        errorBit = parseCmd(cmd, args);
        if (errorBit)
        {
            fprintf(stderr, "Error: Cannot parse command %s\n", cmd);
            exit(1);
        }

        if (*args == "exit")
        {
            terminationBit = 0;
        }
    }
    return 0;
}

このトピックに関するヘルプやアドバイスをいただければ幸いです。

編集:出力に基づいて、実際のsegfaultはstrtok()ではない可能性があります

ここにいくつかの出力があります:

mysh>hi sup
LOGGER: parseCmd(cmd=hi sup, args=0x7fff50ec0b80)
LOGGER: cmdReader=hi
Segmentation fault: 11
4

1 に答える 1

1

単純な間違いのようです:

while (cmd != NULL)
{
    // ...
}

...おそらく次のようになります:

while (cmdReader != NULL)
{
    // ...
}

...cmdおそらく決してなることはないからNULLです。また、これ:

if (*args == "exit")
{
    terminationBit = 0;
}

...おそらくあなたが思うことをするつもりはありません。文字列を比較するには、次を使用します。

if (strcmp(*args, "exit") == 0)
{
    terminationBit = 0;
}

parseCmdそれ以外の場合は、これも何かを返すことを確認する必要があります。

errorBit = parseCmd(cmd, args);

...parseCmdは未定義の動作を生成するため、の値errorBitも完全に未定義であり、その値をチェックする後続の条件も同様です。

最後に、あなたのプログラムは、そのままでは、あなた以来strdupmallocそして決して解放されることなく、メモリリークを起こします。freeを使い終わったら、忘れないでくださいargs

于 2012-10-03T13:14:09.650 に答える