scanf输入格式一个小疑问

哈哈来了了 2010-10-26 10:32:09

#include <stdio.h>

int main()
{
char c1, c2;
scanf("%4c%4c", &c1, &c2);

printf("%c,%c\n", c1, c2);

return 0;
}


为使变量c1得到字符'A',变量c2得到字符'B'应该怎么输入

"%4c%4c" 是什么意思?

谢谢
...全文
410 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2010-10-26
  • 打赏
  • 举报
回复
解释下吧:
%4c,表示要读入4个字符,所以后面的参数所指向的空间要足够,这点是程序员自己保证的。
正如上面所示的那个正确的程序,变量在内存中的样子可以这么来看:

c1[3]
c1[2]
c1[1]
c1[0]
c2[3]
c2[2]
base+1: c2[1]
base: c2[0]

当输入12345678的时候,它们分别从c1[0]和c2[0]开始往上,被依次填充。

然而LZ的程序发生了什么呢?明显空间是不够的,所以越界发生了。
在LZ的程序里面,变量的内存是这样的:

| a[4] b[3]
| a[3] b[2]
| a[2] b[1]
base+1: c1 | a[1] b[0]
base: c2 | a[0]

发现没,空间是不够的,而且C是不做越界检查的,即任何一段连续的内存它都可以看成是char [],即你可以把c1看成是b数组(这里假想的一个数组,方便理解),c2看成是a数组。
和正确的使用情形对比,即可知道到底越界是怎么发生的,A和B是怎样被赋值的。

以上是我的讲解,实际中,大家都可以根据debug这一方法,来观察上述论述过程。
ForestDB 2010-10-26
  • 打赏
  • 举报
回复 1
有个小窍门,你输入12345678或者abcdefgh,看哪两个字符被打印出来,就能知道你该如何输入,把A和B安排在哪个位置了。
根据此方法得到的输入方法是:****AB**回车
*表示其它任何字符,比如空格,数字或者字母或者标点(另外后面的两个*也很重要,它凑足了8个字符)

其实%4c的用法如下才是正确的,能得到上面的答案,其实是一种hack而且也出现越界了,如果感兴趣可以debug之。

int main(int argc, char * argv[])
{
char c1[4], c2[4];
scanf("%4c%4c", c1, c2);
printf("%c,%c\n", c1[0], c2[0]);

return 0;
}
// 正确的输入方法:A***B***回车

哈哈来了了 2010-10-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bobo364 的回复:]
奇怪的写法,%4是限制长度的意思,限制4个字节,可char每次都只能输入一个字符,没必要这么写啊
[/Quote]

在书上看到的一道题 不明白 所以问问大家
大石头1987 2010-10-26
  • 打赏
  • 举报
回复
A B《--
"%4c%4c" 是什么意思?

%4是限制长度的意思,限制4个字节
bobo364 2010-10-26
  • 打赏
  • 举报
回复
奇怪的写法,%4是限制长度的意思,限制4个字节,可char每次都只能输入一个字符,没必要这么写啊

69,374

社区成员

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

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