获取浮点应该是哪个字符串?

时间:2013-12-03 04:22:20

标签: c pointers structure printf scanf

我找不到任何其他例子,所以我希望有人能指出我正确的方向。我的程序必须能够处理包含汽车列表的文本文件,

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

1 个答案:

答案 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;