0

これを理解できません、何か助けはありますか?これは strtok ではないと思います。私のコードだと確信しています。私は何を考えたのか理解できません。Get と Set が sigsevg を引き起こしています。num = strtof などの後に printf() を配置すると、num は正しくても、他のコマンドは正しく解釈されません。

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>

typedef struct
{
    float height;
    float width;
    float length;
}Box;

void usage(void)
{

    printf("\nUsage: [command] [parameter] [amount]\n");
    printf("commands:\n\tSet\n\tGet\n");
    printf("parameters:\n\theight\n\twidth\n\tlength\n");
}


int main()
{
    usage();
    Box box1 = {0,0,0};
    int loop = 1;
    float num;
    char cp[65], *delims =  " !@#$%^&*():;/><.,\\?\"";
    char *tok1, *tok2, *tok3, *temp;

beginning:
    while(loop)
    {

        //Read the command from standard input
        char str[65];
        fgets(str, 64, stdin);
        str[64] = 0;

        //Tokenize the string
        strncpy(cp, str, 64);
        tok1 = strtok(cp, delims);
        tok2 = strtok(NULL, delims);
        tok3 = strtok(NULL, delims);

        //Check if tok3 is float
        num = strtof(tok3, &temp);
        if(num != 0)
        {

        }
        else
        {
            usage();
            goto beginning;
        }
        if(tok1 == 'Get' && tok2 == 'height')
        {
            printf("%f", box1.height);
        }
        else if(tok1 == 'Get' && tok2 == 'width')
        {
          printf("%f", box1.width);
        }
        else if(tok1 == 'Get' && tok2 == 'length')
        {
          printf("%f", box1.length);
        }
        else if(tok1 == 'Get')
        {
           usage();
           goto beginning;
        }

        if(tok1 == 'Set' && tok2 == 'height')
        {
          box1.height = num;
          printf("%f", box1.height);
        }
        else if(tok1 == 'Set' && tok2 == 'width')
        {
          box1.width = num;
        }
        else if(tok1 == 'Set' && tok2 == 'length')
        {
          box1.length = num;
        }
        else if(tok1 == 'Set')
       {
         usage();
         goto beginning;
       }

    }
     return 0;
}
4

1 に答える 1

3
if(tok1 == 'Get' && tok2 == 'height')

C 文字列は二重引用符を使用する必要があり、 を使用して等しいかどうかをテストすることはできません。==使用する必要がありますstrcmp

if(strcmp(tok1, "Get")==0 && strcmp(tok2, "height")==0)

strtof:

num = strtof(tok3, &temp);

を使用する必要がなかった場合はtemp、null ポインターを使用します。

num = strtof(tok3, NULL);

そして、以下を使用したコードgoto:

if(num != 0)
{

}
else
{
    usage();
    goto beginning;
}

goto醜いので、continue代わりに使用してください:

if(num == 0)
{
    usage();
    continue;
}
于 2013-08-05T01:14:52.547 に答える