我找不到任何其他例子,所以我希望有人能指出我正确的方向。我的程序必须能够处理包含汽车列表的文本文件,
modelname year rentalrate< - 是文本文件的格式。我的教授有时会为出租率投入SPECIAL,我需要能够用函数调用中的每日特价代替它。我使用sscanf来解析文件,但是当我到达SPECIAL时,我的代码会产生错误。任何想法如何更好地处理?我真的很感激。
int readCar(Car *s, float special)// function b
{
int success;
char *str = malloc(MAXCARS * sizeof(char));
char *output = malloc(MAXCARS * sizeof(char));
fgets(str, MAX_LINES, stdin);
success = (sscanf(str, "%s %d %f",s->modelName, &s->year, &s->rentalRate));
sprintf(output,"%f",s->rentalRate);
if(strcmp(output, "SPECIAL")== 0)
{
s->rentalRate = special;
}
else if(success == 3)
{
return 0;
}
else
return 1;
}
以下函数是调用上述函数的函数。不确定是否需要这个,但我想我可以把它扔进去。
int readArray(Car *cars, int elemNums, float special)// function c
{
int carCount;
int error;
scanf("%d", &carCount);
if((carCount)>elemNums)
{
printf("\nError: Number of cars exceeds database limit.\n\n");
exit(1);
}
//int i = 0;
Car* c;
for(c = cars; c < (cars + elemNums); c++)
{
error=readCar(c, special);
if(error==1)
{
printf("\nError on line: %s %d $%.2f\n\n", c->modelName, c->year, c->rentalRate);
exit(1);
}
}
fflush(stdout);
return carCount;
}
答案 0 :(得分:1)
将rentalRate
扫描为字符串(即使用%s
),要确定它是字符串还是数字,请检查'0' <= rentalRate[0] && rentalRate[0] < '9'
(或者您可以使用isdigit
来自ctype.h
),如果是字符串,请使用strcmp
将其与"SPECIAL"
else进行比较,并使用atof
进行解析。
现在你有一个从解析浮点数或你的特价商品获得的价格,将这个数字分配给c->rentalRate
,主要点是不直接在c->rentalRate
中扫描数字并使用字符串和浮点数在指定最终值c->rentalRate
之前的临时变量。
既然您说不应该使用atof
,那么您可以实现自己的atof
版本(这不会太难)或者sscanf
代替:{/ p>
sscanf(rentalRate, "%f", &floatRentalRate);
c->rentalRate = floatRentalRate;