C语言中的简单单元转换器

C语言中的简单单元转换器,c,C,我为我的程序编程课买了一本“C语言书”,我正在做一些练习。第2章练习9是关于设计一个单位转换器,它可以处理盎司、磅、克和千克 我写的代码很有效,但我真的认为它可以做得更干净。使用嵌套的if语句似乎是一种混乱的方法 另外,我注意到的一个问题是,如果在第27行上给scanf()一个char或string,它将持续存在,然后被传递到第95行上的scanf()。例如,如果输入“y”作为要转换的值,程序将转到开始,而不允许用户回答“是否要执行其他转换?”我如何着手解决此问题,以便在输入NaN时丢弃它 我的

我为我的程序编程课买了一本“C语言书”,我正在做一些练习。第2章练习9是关于设计一个单位转换器,它可以处理盎司、磅、克和千克

我写的代码很有效,但我真的认为它可以做得更干净。使用嵌套的if语句似乎是一种混乱的方法

另外,我注意到的一个问题是,如果在第27行上给scanf()一个char或string,它将持续存在,然后被传递到第95行上的scanf()。例如,如果输入“y”作为要转换的值,程序将转到开始,而不允许用户回答“是否要执行其他转换?”我如何着手解决此问题,以便在输入NaN时丢弃它

我的代码位于:

最可靠的方法是使用fgets()函数读取输入字符串,使用isdigit()检查它是否包含数字(字符串中的所有字符),然后使用atoi()将其转换为数值


顺便说一句,最后两个操作可以替换为strtol()

清理if结构的一种方法是将值从“fromUnit”转换为公共值,然后将其转换为“toUnit”。它简化了结构,只留下两个if结构。(它的伸缩性也更好)因此,它更像:

if (!strcmp(fromUnit, "pound")) {  
    tempval = input / 16;  
} else if (!strcmp(fromUnit, "gram") == 0) {  
    tempval = input * OUNCESTOGRAMS;  
}  

if (!strcmp(toUnit, "pound")) {  
    output = tempval * 16;  
} else if (!strcmp(toUnit, "gram")) {  
    output = tempval / OUNCESTOGRAMS;  
}  
当然,这个数学是不正确的,这只是一个例子。您只需(1)选择要使用的临时单元(2)从输入单元转换为该单元,以及(3)从临时单元转换为输出单元


正如其他人所提到的,gets()绝对是一种方式。

我会这样做:

#include <stdio.h>

typedef struct _unit {
    char * name;
    float grams;
} unit; 

unit units[] = {
    {"gram", 1.0},
    {"kilogram", 1000.0},
    {"pound", 500.0},
    {"ounce", 28.3495231}
};

unit * search_unit(char * name)
{
    int i;
    for (i = 0; i < (sizeof(units) / sizeof(unit)); i++)
    {
        printf("%d %s\n", i, units[i].name);
        if (0 == strcmp(units[i].name, name))
        {
            return & units[i];
        }
    }
    return NULL;
}
int main() {
    char line[10];
    char unitname[10];
    int number;
    unit * found_unit;

    while (1)
    {
        fgets(line, sizeof(line), stdin);
        if (1 == sscanf(line, "%d", &number))
        {
            break;
        }
        printf("not a number\n");
    }

    while (1)
    {
        fgets(line, sizeof(line), stdin);
        sscanf(line, "%s\n", unitname);
        found_unit = search_unit(unitname);
        if (found_unit)
        {
            printf("%d %s is %f grams\n", number, unitname, found_unit->grams * number);
            break;
        }
        printf("unknown unit\n");
    }
}
#包括
类型定义结构单元{
字符*名称;
浮克;
}单位;
单位[]={
{“gram”,1.0},
{“千克”,1000.0},
{“磅”,500.0},
{“盎司”,28.3495231}
};
单位*搜索单位(字符*名称)
{
int i;
对于(i=0;i<(sizeof(单位)/sizeof(单位));i++)
{
printf(“%d%s\n”,i,单位[i]。名称);
如果(0==strcmp(单位[i]。名称,名称))
{
收益和单位[i];
}
}
返回NULL;
}
int main(){
字符行[10];
字符单位名称[10];
整数;
单位*已找到单位;
而(1)
{
fgets(生产线、尺寸(生产线)、标准DIN);
如果(1==sscanf(行、%d、&number))
{
打破
}
printf(“不是数字”);
}
而(1)
{
fgets(生产线、尺寸(生产线)、标准DIN);
sscanf(第%s\n行,单位名称);
找到单位=搜索单位(单位名称);
如果(找到单位)
{
printf(“%d%s是%f克\n”,编号,单位名称,找到单位->克*号);
打破
}
printf(“未知单位”);
}
}
  • 将数据存储在某些数据结构中,而不是代码中
  • 首先读一行文字,然后检查它是否是数字
  • 从stdin读取时,请考虑缓冲区的大小
  • 使用循环而不是转到
  • 使用一些常用单位,例如克,来计算任何东西对任何东西

我建议设置枚举-从0开始的整数表示类型。然后将转换成一个对称的nxn矩阵。最后,使用它来找到正确的系数。将代码放在这里,而不是使用pastebin。因此,问题应该会一直存在,这样其他人可以从阅读这些问题及其答案中获益。把重要信息放在其他网站上会适得其反。请在你的问题中至少写下代码的重要部分。不
gets()
不安全,它允许缓冲区溢出。改用fgets(str,len,stdin)。我正要提出类似的建议。使用N个转换因子比使用N²转换因子要好得多。我真的记不起读取完整字符串的细微差别。我知道此时您可能希望阅读整行内容,而不仅仅是单个项目。执行两次转换可能会影响精度。没错,但精度不是问题。简单的代码是目标。