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。
答案 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
。
<小时/>
a
,A
,e
,E
,f
,{{1 }},F
或g
) - 它们都假设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");