想不出来,有什么帮助吗?我不认为这是strtok,我很确定这是我的代码。我不知道怎么想的。Get和Set导致了sigsevg。如果我将printf()放在num=strtof等之后,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;
}

最佳答案

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

关于c - 我认为有问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18049328/

10-11 19:00