char str[3]; scanf("%s",str); printf("%s",str); 为什么输入超过3个字符,也全部输出?
答案:3 悬赏:0 手机版
解决时间 2021-03-19 08:38
- 提问者网友:骨子里的高雅
- 2021-03-18 20:32
char str[3]; scanf("%s",str); printf("%s",str); 为什么输入超过3个字符,也全部输出?
最佳答案
- 五星知识达人网友:躲不过心动
- 2021-03-18 21:06
#include
#include
#include
int main(void)
{
char str[3];
printf("%p %p %p\n",&str[0],&str[1],&str[2]);
scanf("%s",str);
int size = strlen(str);
printf("before:%p %c after:%p %c\n",&str[2],str[2],&str[size-1],str[size-1]);
return 0;
}
输出:
0xbfc7f34d 0xbfc7f34e 0xbfc7f34f //str[3] 定义出来的可用空间
sfhksg
before:0xbfc7f34f h after:0xbfc7f352 g //数组的下标访问本质还是指针操作。可以越界操作
//,不过很危险。可能发生不可预料的结果!
看懂了这个你就了解了为什么可以输出多于3个字符了。
#include
#include
int main(void)
{
char str[3];
printf("%p %p %p\n",&str[0],&str[1],&str[2]);
scanf("%s",str);
int size = strlen(str);
printf("before:%p %c after:%p %c\n",&str[2],str[2],&str[size-1],str[size-1]);
return 0;
}
输出:
0xbfc7f34d 0xbfc7f34e 0xbfc7f34f //str[3] 定义出来的可用空间
sfhksg
before:0xbfc7f34f h after:0xbfc7f352 g //数组的下标访问本质还是指针操作。可以越界操作
//,不过很危险。可能发生不可预料的结果!
看懂了这个你就了解了为什么可以输出多于3个字符了。
全部回答
- 1楼网友:迟山
- 2021-03-18 22:57
%s是用来输出一个字符串。
有几种用法:
1: %s,例如printf(“%s”,“china”);输出china;
2:%ms,输出的字符串占m列,如果字符串本身长度大于m,则突破m的限制,将字符串全部输出。若小于m则左补空格;
3:%-ms,如果字符串长度小于m,则在m列范围内,字符串向左靠,右补空格;
4:%m.ns,输出的字符串占m列,但只取字符串中左端n个字符,这n个字符输出在m列的右侧,左补空格;
5:%-m.ns,n个字符输出在m列范围内的左侧,右补空格。如果n>m,则m自动取n的值,即保证n个字符正常输出
- 2楼网友:低音帝王
- 2021-03-18 22:46
你好。printf输出从str首地址开始到第一个'\0'结束。所以可以全部输出。
关键在于scanf输入没有限制输入长度。事实上输入超过3个字符时,数据访问已经越界了。
程序能够运行已经是运气够好了。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯