2

一度に文字列 (a) を解析する関数を作成しようとしていますchar *が、何らかの理由でセグメンテーション エラーが発生します。ユーザー入力を読み込んで、プログラム名と引数を解析しようとしていますが、それはやや不謹慎です。

コンソール:

>./mish 
>mish>ls
>command start:ls 
>*tempCommand:l 
>bottom
>Segmentation fault

コード:

    ParserData parseCommand(ParserData parserData, char* command)
    {
        char* tempCommand;
        char* currToken = '\0';
        short firstSpace = 0;

        printf("command start:%s \n", command);

        strcpy(tempCommand, command);

        while(*tempCommand)
        {
            printf("*tempCommand:%c \n", *tempCommand);

            if((char)*tempCommand == ' ' && firstSpace == 0)
            {
               printf("currToken: %c \n", (char)*currToken);
               strcpy(parserData.myChildProgramName,currToken);
               printf("after:");
               currToken = '\0';
               firstSpace = 1;
            }
            else if((char)*tempCommand != ' ' && *tempCommand != '-')
            {
              //strcat(currToken, tempCommand); 
            }

            printf("bottom\n");

            printf("currToken: %c \n", *currToken);

            tempCommand++;

       }

       printf("out\n");
       parserData.myChildProgramArguments = currToken;

      return parserData;
   }
4

2 に答える 2

4

tempCommandchar*次の場合は、ユニット化されます。

strcpy(tempCommand, command);

が呼び出され、セグメンテーション違反が発生し、strcpy()書き込みをすべきではない場所に書き込まれます。tempCommandを呼び出す前にメモリを割り当てますstrcpy():

tempCommand = malloc(strlen(command) + 1); /* +1 for terminating null. */
if (tempCommand)
{
    /* Use 'tempCommand' */
}

free(tempCommand);必要がなくなったら覚えておいてください。

*curTokenまたは*tempCommandの値をcharすでに型としてキャストする理由はありません。

于 2012-10-21T09:38:26.453 に答える
0

malloc を使用して、メモリを tempCommand 変数に動的に割り当てる必要があります。

何かのようなもの:

tempCommand = malloc(sizeof(command));

これでうまくいくはずです。幸運を!

于 2012-10-21T09:41:20.213 に答える