关于scanf和printf字符串的问题

webscan2222 2012-04-04 09:33:16
程序如下,运行环境为vc6:
int main()
{
char a[5];
char b[5];
while(1)
{
printf("input a:");
scanf("%s",a);
printf("output a:%s\n",a);
printf("input b:");
scanf("%s",b);
printf("output a:%s\n",a);
printf("output b:%s\n",b);
}
}
为什么我输入超过5个字符超过的部分还是会打印出来?还有,当b输入超过7个字符时a的内容也受到影响?
...全文
217 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-04-05
  • 打赏
  • 举报
回复
scanf("%s",a);
应改为
fgets(a,5,stdin);if ('\n'==a[strlen(a)-1]) a[strlen(a)-1]=0;

scanf("%s",b);
应改为
fgets(b,5,stdin);if ('\n'==b[strlen(b)-1]) b[strlen(b)-1]=0;
AnYidan 2012-04-05
  • 打赏
  • 举报
回复
正确的程序只应该输出唯一的结果
错误的程序经常给你一些 surprise
luochao7050838 2012-04-05
  • 打赏
  • 举报
回复
越界的说,别这么写,栈溢出了
x332363930 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 2 楼 的回复:

运行结果是这样的:
第一种情况:
input a:aaaaaa(6个a)
显示output a:aaaaaa
input b:bbbbbb(6个b)
显示output a:aaaaaa
显示output b:bbbbbb

第二种情况:
input a:aa
显示output a:aaaaaa
input b:bbbbbbbbbb(10个b)……
[/Quote]
至于为什么你那儿a,b输入6个的时候,a输出的是aaaaaa。我觉得是编译器的原因吧,我这儿的输出是符合我的说法的
input a:aaaaaa
output a:aaaaaa
input b:bbbbbb
output a:b
output b:bbbbbb
x332363930 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

运行结果是这样的:
第一种情况:
input a:aaaaaa(6个a)
显示output a:aaaaaa
input b:bbbbbb(6个b)
显示output a:aaaaaa
显示output b:bbbbbb

第二种情况:
input a:aa
显示output a:aaaaaa
input b:bbbbbbbbbb(10个b)
显示output a:bb
……
[/Quote]
输出几个字符跟定义的数组大小没关系,字符串是根据'\0'判断末尾的,他会一直输出直到遇到'\0'。
另外在内存中a,b的位置是b[0],b[1],b[2]....a[0],a[1]... 当b的输入的数大于b的空间时,自然会占用a的空间,然后在末尾加上'\0'。所以a会输出bb
pengfoo 2012-04-04
  • 打赏
  • 举报
回复
楼主不要过分纠结结果。因为
char a[5];
char b[5];
只分别分配了5个元素的空间。你一下子输入多于5个则会发生数组越界,有可能操作系统分配空间是a,b是相邻的,所以a,b之间才会出现了影响。
你把改大点就没事了。
char a[500];
char b[500];

proorck6 2012-04-04
  • 打赏
  • 举报
回复
这是由函数决定的,并不是由C语言决定的,
scanf函数就是这么设计的。
至于为什么这么设计,确实值得思考。
webscan2222 2012-04-04
  • 打赏
  • 举报
回复
运行结果是这样的:
第一种情况:
input a:aaaaaa(6个a)
显示output a:aaaaaa
input b:bbbbbb(6个b)
显示output a:aaaaaa
显示output b:bbbbbb

第二种情况:
input a:aa
显示output a:aaaaaa
input b:bbbbbbbbbb(10个b)
显示output a:bb
显示output b:bbbbbbbbbb

第一种情况为什么会输出6个字符,我定义数组范围为5啊
第二种情况怎么数组b中的部分内容把数组a的给覆盖了?
  • 打赏
  • 举报
回复
越界了,后果未知。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧