缓冲区溢出错误和 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-specifier是f
,length-modifier是l
1,精度为.1
。
- 请注意,此修饰符对浮点转换说明符(
a
、A
、e
、E
、f
、F
、g
或 G
) - 它们都假定一个 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");
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-specifier是f
,length-modifier是l
1,精度为.1
。
- 请注意,此修饰符对浮点转换说明符(
a
、A
、e
、E
、f
、F
、g
或G
) - 它们都假定一个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");