改进C中的代码

时间:2018-04-22 05:37:14

标签: c

我是编程的新手,如果输入无效,我会尝试返回一些错误。到目前为止我已经得到了下面的代码并且它有效但是我还能做些什么来改进它吗?

#include <stdio.h>
#include <stdlib.h>

#define pi 3.141593

int main(void)
{
    float inner_d, outer_d, surface_area, radius;

    printf("Enter the outer diameter:\n");
    scanf("%f", &outer_d);

    printf("Enter the inner diameter:\n");
    scanf("%f", &inner_d);

    if (inner_d >= outer_d)
    {
        printf("Inner diameter must be less than outer diameter\n");
        return 0;
    }
    else if (inner_d < 0 || outer_d < 0)
    {
        printf("Both outer and inner measurements must be possitive\n");
        return 0;
    }

    float inner_a = (inner_d / 2) * (inner_d / 2) * pi;
    float outer_a = (outer_d / 2) * (outer_d / 2) * pi;

    surface_area = outer_a - inner_a;

    printf("Your surface area is: %f\n", surface_area);
    return 0;
}

3 个答案:

答案 0 :(得分:4)

在C中,main函数应在成功退出时返回0,否则返回一些错误代码。这样您就可以区分成功和不同的错误。 @Stargateur的评论中提到了一种方法:

#include <stdio.h>
#include <stdlib.h>

#define pi 3.141593

int main(void)
{
    float inner_d, outer_d, surface_area, radius;

    printf("Enter the outer diameter:\n");
    scanf("%f", &outer_d);

    printf("Enter the inner diameter:\n");
    scanf("%f", &inner_d);
    if (inner_d < 0 || outer_d < 0 || inner_d >= outer_d) { return EXIT_FAILURE;}
    float inner_a = (inner_d / 2) * (inner_d / 2) * pi;
    float outer_a = (outer_d / 2) * (outer_d / 2) * pi;  

    surface_area = outer_a - inner_a;

    printf("Your surface area is: %f\n", surface_area);
    return 0;
} 

答案 1 :(得分:4)

如果你想对无效输入作出反应,首先要做的事情就是检查读取或解析输入的任何函数的实际返回值 - 这是你的scanf()。出于显示错误消息的目的,它非常简单:

if (scanf("%f", &outer_d) != 1) // expect exactly 1 successful conversion here
{
    fputs("Input error: not a number\n", stderr);
    return EXIT_FAILURE;
}

请注意,如果您的要求是在输入错误后重试,则会遇到scanf()的一些问题。在这种情况下,我建议您阅读beginners' guide away from scanf()

进一步提示:

  • main()的返回值表示整个程序失败成功。 stdlib.h中定义了两个宏:EXIT_SUCCESSEXIT_FAILURE - &gt;使用它们。通常,0对应EXIT_SUCCESS,因此您在发生错误后不应该return 0;

  • 错误消息(以及一般情况下,“状态/日志/调试”消息)转到stderr,而不是stdout。这允许其他过程或用户区分它们,例如,可以使用./your_program 2>error.log记录所有错误,并仍然可以在屏幕上看到正常输出。因此,请使用fputs(..., stderr);和/或fprintf(stderr, "... %d ...", ...);作为错误消息。

  • printf()系列函数用于格式化输出。如果您没有任何格式,请使用puts()系列函数,请参阅man puts。使用printf()无论如何都没有直接的错误,但它是浪费的,并且可以是危险的,因为无论你传递什么都被视为格式字符串,google“格式字符串攻击”以获取深入信息

    这是概念上与scanf()(用于解析输入)和fgets()(仅用于阅读它)相同的二元性。

答案 2 :(得分:0)

当我找到你时,你可以使用if else语句检查你的验证并相应地打印错误。

#include <stdio.h>
#define pi 3.141593

int main(void)
{
   float inner_d, outer_d, surface_area, radius;

   printf("Enter the outer diameter:\n");
   scanf("%f", &outer_d);

   printf("Enter the inner diameter:\n");
   scanf("%f", &inner_d);

   if (inner_d <= 0.0) {
      printf("Inner_d must be positive number");
   }
   if (outer_d <= 0.0) {
      printf("Outer_d must be positive number");
   }
   if (inner_d > outer_d) {
      printf("Inner_d must less than outer_d");
   }

   float inner_a = (inner_d / 2) * (inner_d / 2) * pi;
   float outer_a = (outer_d / 2) * (outer_d / 2) * pi;

   surface_area = outer_a - inner_a;


   printf("Your surface area is: %f\n", surface_area);
}