我正在尝试添加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);
}
我哪里错了?
答案 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)
喜欢这个
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问题的根本原因。