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

Buffer overflow error and Double data type error

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)); 

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

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

您正在将 e 的内容附加到 s。但是由于您初始化的方式 s 它不够大,无法容纳额外的字符。

例如

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]

由于您的初始化方式,s 的大小仅足以容纳字符串 "Hello"(总共 6 个元素)。如果您希望能够将任何内容附加到 s,您必须使用明确的大小来声明它:

char s[MAX_SIZE] = "Hello";

其中 MAX_SIZE 足以容纳 "Hello" 加上 e.

中的任何内容

The output for double data should be 10.0 ,if input is 6 but it gives me 10.000000 instead

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

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

这会将输出限制为小数点后一位。

转换规范基本上采用以下形式

<strong>%</strong> [<em>flags</em>] [<em>field-width</em>] [<strong>.</strong> <em>precision</em>] [<em>length-modifier</em>] <em>conversion-specifier</em>

其中方括号中的项目是可选的。在上面的语句中,conversion-specifierflength-modifierl1精度.1


  1. 请注意,此修饰符对浮点转换说明符(aAeEfFgG) - 它们都假定一个 double 参数。

问题出在 strcat 调用上。 strcat(destination, source) 将 source 中的字符附加到 destinations 中的字符,并添加一个 0 字符来标记字符串的结尾。这意味着目标必须有足够的 "free space" 来容纳源。在您的情况下,目标已经 "full" 因为您已将其初始化为 6 个字节的缓冲区(5 个字符 + 结尾的 \0 字符)。如果您尝试在该缓冲区结束后写入任何内容(例如 s[6]=5;),您将写入未分配的内存。使用 strcat 向其附加任何内容也会导致写入未分配的内存,从而产生意外结果。

一个解决方案是声明 s 的大小不变,然后像这样对它进行 strcpy 操作:

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