标题:scanf的%s的问题!
只看楼主
johnzsj
Rank: 2
等 级:论坛游民
帖 子:54
专家分:27
注 册:2017-2-10
结帖率:93.75%
已结贴  问题点数:20 回复次数:11 
scanf的%s的问题!
今天,读了c primer plus 不能理解:不能通过字段宽度使得scanf读入超过一个字长的输入?请问该怎么正确理解这一段话?经过实验貌似也不能证明这个观点!

注:本人是64位的操作系统(八个字节);一个英文字母是一个字节;

实验程序:
#include<stdio.h>

int main()
{
    int a[100];

    scanf("%9s",a);

    printf("%s\n",a);


    return 0;
}

结果:
lalalalalal
lalalalal
Press any key to continue
搜索更多相关主题的帖子: 英文字母 continue return 操作系统 
2017-03-27 16:45
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:10 
宽度限制的意思是,最多只能读取9个字符,超过9个被抛弃。但是……被抛弃的字符已经存在缓冲区中。

所以……用scanf从标准输入中读取数据,历来是不安全的,只适用于玩具程序。

[此贴子已经被作者于2017-3-27 16:48编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-27 16:47
johnzsj
Rank: 2
等 级:论坛游民
帖 子:54
专家分:27
注 册:2017-2-10
得分:0 
回复 2楼 renkejun1942
但那本书中说只能读取一个字长的输入,我电脑是64位的一个字长为八个字节,现在我限制宽度为九个字节但奇怪的是被读取出来了(不是应该只能读八个字节的吗!),我不理解这个问题?
2017-03-27 16:53
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 3楼 johnzsj
那说明翻译错误。
C_Primer_Plus 错误还是有点多,不过都是小错误。
scanf() 的%s的宽度限制,限制的是字节。
不知道你看的第几版,我看过第五版,我记得貌似没这个错误,可能太久远我忘记了。

[此贴子已经被作者于2017-3-27 16:57编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-27 16:56
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
我就说我没记错嘛,别人明明说的是字段。


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-27 17:00
johnzsj
Rank: 2
等 级:论坛游民
帖 子:54
专家分:27
注 册:2017-2-10
得分:0 
回复 4楼 renkejun1942
那请问这句话怎样正确理解:不能通过字段宽度使得scanf()用一个%s,说明符读取多于一个字的输入。怎么改他就对了?
2017-03-27 17:00
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
scanf()的%s的修饰符,限制的是读取的字符数。

%9s,就是最多读取9个字符。
%10s,就是最多读取10个字符。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-27 17:03
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
而且这没什么好理解的,scanf()这个函数,你根本不该用它来读取字符串,现在不该,以后更加不该。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-27 17:06
johnzsj
Rank: 2
等 级:论坛游民
帖 子:54
专家分:27
注 册:2017-2-10
得分:0 
回复 5楼 renkejun1942
貌似读取多于一个字长也没什么影响,还是输出了设定字段宽度的宽度,是ide优化的问题还是c的一种非强制性的规范
2017-03-27 17:08
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 9楼 johnzsj
对于这个问题,自行百度,缓冲区溢出攻击。


[此贴子已经被作者于2017-3-27 17:17编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-27 17:15



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-475542-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.211180 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved