添加不在c中工作

时间:2016-01-18 19:17:30

标签: c printf addition format-specifiers

我正在尝试添加c代码,但我的程序没有执行,不幸的是,代码块关闭了。错误是什么?

void main()
{
    float  a,b;

    printf("%30sAddition Of Numbers\n");
    printf("\nEnter Number 1: ");
    scanf("%f",&a);
    printf("\nEnter Number 2: ");
    scanf("%f",&b);

    printf("\nThe addition of %0.3f and %0.3f is %0.3f",a,b,(a+b));

}

我想直接在printf语句中使用float输入添加结果,但我没有让它工作。

我也尝试将结果放在变量a中,但它也不起作用。

    void main()
{
    float  a,b;

    printf("%30sAddition Of Numbers\n");
    printf("\nEnter Number 1: ");
    scanf("%f",&a);
    printf("\nEnter Number 2: ");
    scanf("%f",&b);
    a=a+b;
    printf("\nThe addition of %0.3f and %0.3f is %0.3f",a,b,a);

}

我哪里错了?

4 个答案:

答案 0 :(得分:5)

问题出在以下声明中

 printf("%30sAddition Of Numbers\n");

这里,格式字符串提供给printf() conatins %30s(或者,%s,一般来说),它是格式说明符(转换说明符),并且您没有提供任何格式字符串论证。它调用undefined behavior

引用C11标准,章节§7.21.6.1

  

[...]如果格式的参数不足,则行为为   未定义。 [...]

您还可以查看man page以了解有关格式说明符的更多信息。

编辑:

如下面的评论中所述,如果您希望在输出之前显示一些空格,请更改

printf("\t\tAddition Of Numbers\n");  

那就是说,

  • void main()至少应该int main (void)符合标准。
  • 您应始终检查scanf()的返回值,以确保扫描成功。

答案 1 :(得分:1)

你的帖子中的"%30sAddition of Numbers \ n" 问题已经通过两个好的答案解决了(在本文发布时)。但是你在评论中提出了一个可能没有完全回答的问题:

当我使用所有整数而不是浮点数时,

与%30s一起使用!我如何使它与浮动工作。

该问题的一般答案:
如果在意外的换行符,空格或其他空格中进行扫描,则在 scanf()"%f",&a中使用的格式说明符可能会导致不良结果。这可以通过修改格式说明符字符串来解决这些字符来解决。这是一个建议:

char* fmt = "%[^\n]%*c";//This generic format specifier, can be used for both integer
                        //and floating point inputs when used in conjuction
                        //with strtod() or strtol() (see below)
scanf(fmt, input);

"%[^\n]%*c" 的解释。

当要求用户输入通用时,它可能是浮点数或整数。您可以通过为两者创建方法来满足这一要求,并具体说明您希望处理的值类型:

float get_float(void)
{
    char input[80];
    char **dummy={0};
    char* fmt = "%[^\n]%*c";
    printf("Enter floating point number and hit return:\n");
    scanf(fmt, input);
    return strtod(input, dummy);
}

long get_int(void)
{
    char input[80];
    char **dummy={0};
    char* fmt = "%[^\n]%*c";
    printf("Enter integer number and hit return:\n");
    scanf(fmt, input);
    return strtol(input, dummy, 10);
}

这样称呼:

int main(void)
{
    long integer_var = get_int();
    float float_var = get_float();
    float sum = (float)integer_var + float_var;

    return 0;
}

答案 2 :(得分:1)

  1. 尝试添加 getch();关闭大括号之前的底部函数,

喜欢这个

void main()
 {
  
  float  a,b;
  printf("%30sAddition Of Numbers\n");
  printf("\nEnter Number 1: ");
  scanf("%f",&a);
  printf("\nEnter Number 2: ");
  scanf("%f",&b);
  a=a+b;
  printf("\nThe addition of %0.3f and %0.3f is %0.3f",a,b,a);
  getch();//it will hold your output screen so you can see the output 
}

答案 3 :(得分:0)

在这一行

printf("%30sAddition Of Numbers\n");

您没有为%s格式提供字符串参数。这会导致未定义的行为

如果您想要输出间隔,可以尝试一个小修改

printf("%30s\n", "Addition Of Numbers");

在这种情况下,您提供字符串文字以满足%s格式。

此外,您必须始终检查来自scanf的返回值,以确定它确实转换了它应该的参数数量。它不是一个基本的新手错误,也是数百个SO问题的根本原因。