我认为strtok问题

时间:2013-08-05 01:10:51

标签: c string strtok

无法解决这个问题,有什么帮助吗?我不认为这是strtok,我很确定这是我的代码。我无法弄清楚是什么想法。获取和设置正在导致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;
}

1 个答案:

答案 0 :(得分:3)

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

C字符串必须使用双引号,并且您无法使用==测试它们,您应该使用strcmp

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

关于strtof

num = strtof(tok3, &temp);

如果您不必使用temp,请使用空指针:

num = strtof(tok3, NULL);

使用goto的代码片段:

if(num != 0)
{

}
else
{
    usage();
    goto beginning;
}

goto很难看,请改用continue

if(num == 0)
{
    usage();
    continue;
}