想不出来,有什么帮助吗?我不认为这是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/