c语言gets()问题

#include<stdio.h>intmain(){chars[5];inti;printf("输入字符:");gets(s);printf("%s",s);print... #include <stdio.h>
int main()
{
char s[5];
int i;

printf("输入字符:");
gets(s);
printf("%s",s);
printf("\n");

for(i=0;i<5;i++)
{
printf("%c",s[i]);
}
printf("\n");
printf("%s",s);

return 0;
}

请问三次输出为什么会不一样
准确点说 printf("%s",s); 这句前后两次执行为什么结果不一样?
展开
 我来答
free逍遥星空
2015-10-25 · TA获得超过344个赞
知道小有建树答主
回答量:231
采纳率:100%
帮助的人:205万
展开全部
s的空间为5个字节,因此你的输入已经超出其范围,但是C语言不会判断你指针越界错误,导致溢出了。这里把堆栈区其他的范围覆盖了。
建议加一些限制输入的条件。
这里是因为越界以及输入输出大小不匹配导致的问题。
追问
请问printf("%s",s); 这句前后两次执行为什么结果不一样?
追答
main函数申请了32个字节的栈帧空间。
gets()函数使用的空间原本应该分配的5个,但是这里溢出了,因此在该栈帧往下的空间是被gets函数的赋值占用了。但是编译器不知道你溢出了,依旧是像没溢出一样将for循环中的局部变量分配在原本分配的栈帧中,因此又将溢出后赋值占用的空间又覆盖了一次。
原本空间中的值应该是0x41 0x42 0x43 0x44 0x45 [0x46 0x 47 0x48....]这里括号是说的溢出覆盖的值,现在局部变量i又赋值,连续加了五次后空间变为0x41 0x42 0x43 0x44 0x45 0x05....... ,于是打印的是该序列对应的字符串。
简单说:就是局部变量i将原始abcdefg中f应该存在的地址中的值覆盖掉了,导致abcde之后的字符串识别出来不是那个abcdefg意思。
以上。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式