使用 switch 语句调用函数

Posted

技术标签:

【中文标题】使用 switch 语句调用函数【英文标题】:Using switch statements to call functions 【发布时间】:2018-10-02 02:45:48 【问题描述】:

我正在尝试用 C 语言编写一个程序,该程序使用 switch 语句来决定使用哪个被调用函数来转换各种值。我的指示如下:

“创建一个程序来将华氏温度转换为摄氏温度,将摄氏温度转换为华氏温度,将英寸转换为厘米,以及将厘米转换为英寸。将您的选择放入 switch 语句中,这样它们就会出现在屏幕上,如下所示:

Select from the menu below to covert temperature or linear menus:



1 Convert Fahrenheit to Celsius

2 Convert Celsius to Fahrenheit

3 Convert Inches to Centimes

4 Convert Centimeters to Inches

5 Exit the program

Enter your selection:

将每个转换例程都设为您将从主程序中调用的函数。每个选择都应该是 switch 语句中的一个案例。请务必根据编码标准注释所有代码。

当我运行程序并输入选项后跟要转换的值时,会出现一个奇怪的数字,然后是

ProgramExiting.ProgramExiting.

这是我的代码:

#include <stdio.h>

void FahrenheitToCelsiusConversion (double conversionValue) 

    double output;

    output = conversionValue / (9.0 / 5.0) - 32;

    printf("%d", output);


void CelsiusToFahrenheitConversion (double conversionValue) 

    double output;

    output = conversionValue * (9.0 / 5.0) + 32;

    printf("%d", output);


void InchesToCentimetersConversion (double conversionValue) 

    double output;

    output = conversionValue * 2.54;

    printf("%d", output);


void CentimetersToInchesConversion (double conversionValue) 

    double output;

    output = conversionValue / 2.54;

    printf("%d", output);


int main(void) 

int conversionChoice;
double conversionValue;

printf("Select from the menu below to convert temperature or linear\n");
printf("menus:");
printf("\n");
printf("1 Convert Fahrenheit to Celsius\n");
printf("2 Convert Celsius to Fahrenheit\n");
printf("3 Convert Inches to Centimeters\n");
printf("4 Convert Centimeters to Inches\n");
printf("5 Exit the Program\n");

scanf("%d", &conversionChoice);

printf("Enter the value you wish to convert:\n");
scanf("%d", &conversionValue);

switch (conversionChoice) 

case 1:
    FahrenheitToCelsiusConversion(conversionValue);

case 2:
    CelsiusToFahrenheitConversion(conversionValue);

case 3:
    InchesToCentimetersConversion(conversionValue);

case 4:
    CentimetersToInchesConversion(conversionValue);

case 5:
    printf("Program exiting.");


default:
    printf("Program exiting.");



return 0;   


【问题讨论】:

C switch 语句提供自动 fall-through 除非在每个语句中都提供了 break; 语句。例如,您的 case 1 将在失败时执行 1,2,...default 我已经修复了我的 switch 语句语法,并在打印语句中使用了正确的扫描标识符。我现在的问题是,当我想要小数时,我的输出都是整数。 您修复了所有printf("%d", output); 语句吗?应该是printf("%f", output);(我可能会将其限制为理智的"%.2f",只是为了减少默认的小数位数5或6) @DavidC.Rankin 我将它们更正为 %ld,但仍然得到整数。将它们全部更改为 %.2f,但是当我尝试将 5 英寸转换为厘米时,我得到了 0.00;当我试图将 35 华氏度转换为摄氏度时,我得到了 -32。出于某种原因,在将 %ld 更改为 %.2f 后,所有乘法和除法都会导致 0 什么都不应该是%ld%lf(关于扫描和打印)——先搞定,然后再担心漂亮的格式。 【参考方案1】:

您首先缺少breaks。 (因此,如果您选择选项 1,它还将执行选项 2 3 4 和 5)

conversionValuedouble,但您使用 %d 扫描它。这意味着您没有转换您认为的价值。基本调试(打印您的输入值)会突出显示这一点。

您所有的打印件都在尝试使用 %d 打印双精度(双精度应为 %lf

将输出与计算相结合是不好的。即您的convert 例程应该返回转换后的值,并且打印应该在转换函数之外。

【讨论】:

如果编译器警告被正确启用,则意味着编译器会发出被忽略的警告……(格式说明符的不匹配可能会导致未定义的行为。 ) @John3136 感谢您的帮助。对这一切还是陌生的。我没想过要调试,我现在每次都在这样做。我现在的问题是程序总是为结果输出整数,即使我在所有内容中都使用双精度数。我可以改变什么?【参考方案2】:

作为您的 cmets 的后续操作,请了解 printf 将默认使用 "%f" 打印 doubles,但是,要读取带有 scanfdouble,您必须使用 l 长度修饰符,例如"%lf"。格式说明符不匹配会导致未定义行为

此外,正如您所发现的,您的F-&gt;C 转换逻辑需要...帮助。 32 在错误的点被减去,应该是:

void FahrenheitToCelsiusConversion (double conversionValue) 

    double output;

    output = (conversionValue - 32) / (9.0 / 5.0);

    printf ("%.2f\n", output);

注意:printf 格式也发生了变化)

此外,在main() 中,您只需一次调用printf(或fputs,因为不涉及转换)即可打印整个菜单。当您以双引号终止一行并且下一行以双引号开始时,C 将连接字符串,例如

    printf ("\nSelect from the menu below to convert temperature or linear\n"
            "menus:\n\n"
            "  1 Convert Fahrenheit to Celsius\n"
            "  2 Convert Celsius to Fahrenheit\n"
            "  3 Convert Inches to Centimeters\n"
            "  4 Convert Centimeters to Inches\n"
            "  5 Exit the Program\n\n"
            "choice: ");

始终,始终验证所有用户输入,这意味着至少验证scanf返回(如果在匹配后没有退出 失败 - 您必须读取并丢弃留在stdin 中的所有违规字符,因为当发生 匹配 失败时,不会从输入缓冲区中删除更多字符以及导致 匹配失败仍然未读,只是在等待下次尝试从输入缓冲区读取时再次咬你)。

至少检查预期的转换次数是否成功完成(如果适用,您应该进一步检查任何数字输入是否在范围内),例如

     if (scanf ("%d", &conversionChoice) != 1 || conversionChoice < 1 ||
                conversionChoice > 5) 
        fputs ("error: invalid input, or value out of range.\n", stderr);
        return 1;
    

    printf ("\nEnter the value you wish to convert: ");
    if (scanf ("%lf", &conversionValue) != 1) 
        fputs ("error: invalid value input.\n", stderr);
        return 1;
    

您表示您已将break 语句添加到您的switch 语句中,但是在我们讨论了默认的fall-through 行为之后,您是否明白为什么以下内容有效?

    switch (conversionChoice) 

        case 1:
            FahrenheitToCelsiusConversion(conversionValue);
            break;
        case 2:
            CelsiusToFahrenheitConversion(conversionValue);
            break;
        case 3:
            InchesToCentimetersConversion(conversionValue);
            break;
        case 4:
            CentimetersToInchesConversion(conversionValue);
            break;
        case 5:     /* here you CAN use fall-through */
        default:
            printf("Program exiting.");
            break;
    

将所有部分放在一起,您可以执行以下操作:

#include <stdio.h>

void FahrenheitToCelsiusConversion (double conversionValue) 

    double output;

    output = (conversionValue - 32) / (9.0 / 5.0);

    printf ("%.2f\n", output);


void CelsiusToFahrenheitConversion (double conversionValue) 

    double output;

    output = conversionValue * (9.0 / 5.0) + 32;

    printf ("%.2f\n", output);


void InchesToCentimetersConversion (double conversionValue) 

    double output;

    output = conversionValue * 2.54;

    printf ("%.2f\n", output);


void CentimetersToInchesConversion (double conversionValue) 

    double output;

    output = conversionValue / 2.54;

    printf ("%.2f\n", output);


int main (void) 

    int conversionChoice;
    double conversionValue;

    printf ("\nSelect from the menu below to convert temperature or linear\n"
            "menus:\n\n"
            "  1 Convert Fahrenheit to Celsius\n"
            "  2 Convert Celsius to Fahrenheit\n"
            "  3 Convert Inches to Centimeters\n"
            "  4 Convert Centimeters to Inches\n"
            "  5 Exit the Program\n\n"
            "choice: ");

    if (scanf ("%d", &conversionChoice) != 1 || conversionChoice < 1 ||
                conversionChoice > 5) 
        fputs ("error: invalid input, or value out of range.\n", stderr);
        return 1;
    

    printf ("\nEnter the value you wish to convert: ");
    if (scanf ("%lf", &conversionValue) != 1) 
        fputs ("error: invalid value input.\n", stderr);
        return 1;
    

    switch (conversionChoice) 

        case 1:
            FahrenheitToCelsiusConversion(conversionValue);
            break;
        case 2:
            CelsiusToFahrenheitConversion(conversionValue);
            break;
        case 3:
            InchesToCentimetersConversion(conversionValue);
            break;
        case 4:
            CentimetersToInchesConversion(conversionValue);
            break;
        case 5:     /* here you CAN use fall-through */
        default:
            printf("Program exiting.");
            break;
    

    return 0;

使用/输出示例

$ ./bin/tempconv

Select from the menu below to convert temperature or linear
menus:

  1 Convert Fahrenheit to Celsius
  2 Convert Celsius to Fahrenheit
  3 Convert Inches to Centimeters
  4 Convert Centimeters to Inches
  5 Exit the Program

choice: 1

Enter the value you wish to convert: 212
100.00

始终在启用警告的情况下进行编译,并且不要接受代码,直到它在没有警告的情况下干净地编译。要启用警告,请将 -Wall -Wextra 添加到您的 gccclang 编译字符串中。 (添加-pedantic 以获得其他几个警告)。对于clang,您可以改用-Weverything。对于 VS(windoze 上的cl.exe),添加/W3(或使用/Wall,但您会收到很多无关的非代码相关警告)。阅读并理解每个警告。他们将识别任何问题,以及它们发生的确切线路。通过聆听编译器告诉您的内容,您可以学到很多东西。

虽然不是错误,但 C 通常避免使用 camelCaseMixedCase 变量名,而保留所有 小写 名称,同时保留 大写 名称用于宏和常量。这是一个风格问题——所以这完全取决于你,但不遵循它可能会在某些圈子中导致错误的第一印象。参见例如NASA - C Style Guide, 1994 与 C 标准之外的任何内容一样,您一定会发现禁忌症,但通常 camelCaseMixedCase 留给 java 或 C++。

如果您还有其他问题,请告诉我。

【讨论】:

这是超级信息。我已经上交了我的作业,但我会将所有这些合并到我本地的版本中,以便我可以参考。谢谢!! 很高兴它有帮助。请记住,C 不是您在一个学期甚至一年内就能学到的东西。这更像是一个持续学习的旅程,你慢慢地增加你的知识。关键是尽早建立良好的实践和习惯,密切关注所有变量的输入验证和初始化,并学会启用和使用编译器警告——与 30 年前相比,它们今天已经相当不错了。

以上是关于使用 switch 语句调用函数的主要内容,如果未能解决你的问题,请参考以下文章

js中switch语句中case值可不可以表示一个范围

从asp.net mvc中的switch case调用javascript函数

内联函数和宏定义

switch case和return的用法

c语言中switch怎么用?

如何从appdelegate调用方法[重复]