缓冲区溢出错误和双数据类型错误

时间:2016-10-11 13:45:20

标签: c buffer-overflow

int i=4,a,sum;
double b,d=4.0,sum2;
char e[100],s[]="Hello";

scanf("%d",&a);
scanf("%lf",&b);
fgets(e,100,stdin);
sum=i+a;
sum2=d+b;
printf("%d\n",sum);
printf("%lf\n",sum2);
printf("%s",strcat(s,e)); 

这是一个示例代码,它给了我缓冲区溢出错误..我在哪里错了。任何人都可以帮助我fgets行错误或printf strcat行,因为它没有给我所需的输出。 双数据的输出应该是10.0,如果输入是6,但它给我10.000000。

3 个答案:

答案 0 :(得分:3)

由于您对其进行初始化,s只能保留字符串"Hello"(总共6个元素)。如果您希望能够向s添加任何内容,则必须使用明确的大小声明它:

char s[MAX_SIZE] = "Hello";

其中MAX_SIZE足以容纳"Hello"加上e中的任何内容。

  

双数据的输出应该是10.0,如果输入是6,但它给我10.000000而不是

您需要将精度指定为转换规范的一部分:

printf( "%.1lf\n", sum2 ); 

这会将输出限制在小数点后的1位数。

转换规范基本上采用

形式
% [flags] [field-width] [. precision] [length-modifier] conversion-specifier

方括号中的项目是可选的。在上面的语句中,转换说明符f长度修饰符l 1 ,并且精度.1

<小时/>

  1. 请注意,此修饰符对浮点转换说明符(aAeEf,{{1 }},Fg) - 它们都假设G个参数。

答案 1 :(得分:2)

printf("%s",strcat(s,e)); 

您要将e的内容附加到s。但由于您初始化s的方式,它不足以容纳其他字符。

e.g。

s[]="Hello";

s[0] = 'H'
s[1] = 'e'
s[2] = 'l'
s[3] = 'l'
s[4] = 'o'
s[5] = 0

但是从s[6]开始的记忆不再属于你了 - 而你正试图在那里写e的内容 - 不是吗?

对定义大小的s使用更大的数组,例如char s[SOME_SIZE]

答案 2 :(得分:1)

问题是strcat调用。 strcat(destination, source)将源中的字符附加到目标中的字符,并添加0字符以标记字符串的结尾。这意味着目的地必须有足够的空间&#34;适合来源。在你的情况下,目的地已经#34;已满#34;因为您已将其初始化为6字节的缓冲区(5个字符+结束\ 0字符)。如果您尝试在该缓冲区结束后写入任何内容(例如s[6]=5;),您将写入未分配的内存。使用strcat向它添加任何内容也会导致写入未分配的内存,从而产生意想不到的结果。

解决方法是声明s具有恒定的大小,然后像这样对它进行strcpy:

char s[100];
strcpy(s,"Hello");