免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: unixbiginner
打印 上一主题 下一主题

新手提问:怎么用gets()只取Int值? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2005-08-09 12:51 |只看该作者

新手提问:怎么用gets()只取Int值?

原帖由 "mq110" 发表:



如果你编译的时候 开启警告的话.就会发现有那样的问题.
不至于向你说的 什么,.........

而且你说的
>;>;地方可能是在硬件中断时候对于缓冲区处理问题

这都是早期的操作系统吧? 不支持虚拟内存的情..........


你可以在TC下执行或是VC 控制台下执行看看
正确输入的话,每循环一次要等待你一次输入。
没按正确格式输入的话,那么scanf函数就更本就被跳过去了,
当发生输入中断的时候中断位会被置为不可发生,当完成输入又把状态置回可以发生。这个过程好象是扫描一个键盘缓冲区的一个循环队列,当队列空的话就是可输入状态,当不空的话从里面读取数据,也就对应着状态的中不可中断,但这段程序执行过程中scanf()没执行,那么缓冲区中就还有数据也就是不可以输入。。。。这些知识猜测

论坛徽章:
0
12 [报告]
发表于 2005-08-09 14:11 |只看该作者

新手提问:怎么用gets()只取Int值?

至于不用scanf的理由是他对数据格式化的处理不严格,往往由于你没有太关心你的格式导致了,想不到的错误
结果就大出意料了,而看这结果解释为什么也不是很容易的,必须熟悉scanf()函数的源代码因为真正错的地方可能是在硬件中断时候对于缓冲区处理问题(有没有清空还是忽略的 --知识猜测);;
所以很多人都捧cin 比scanf多好多好的






有没有搞错啊,你什么硬件中断,不要瞎猜!!
scanf有个地方大概这样

如果fmt有个%d,那么从stdin取字符必须是shuzi ,否则把取到的输入放回stdin的缓冲区,大概的过程当然就是
count++;
cru--;等修改缓冲区的特点的,当然如果你不知道我说的是什么你不用知道这些啦

如果不是数字,那么就此次输入失败
如果只有scanf("%d",&i); 那么返回成功的项数,当然就是0了,如果成功就是1了,实际程序中可以这样,
while(scanf("%d",&i)==0) getchar();
OK,当然不是很有必要这样的代码,程序要你输入数字你也不会输入字符吧

还有scanf是运行时库函数,根据运行时候的参数来决定行为。,
而cin是操作符重载而已 >;>;根据参数的类型直接编译成相应的代码,不需象 scanf的时候再检测。

论坛徽章:
0
13 [报告]
发表于 2005-08-09 14:18 |只看该作者

新手提问:怎么用gets()只取Int值?

而且你说的
>;>;地方可能是在硬件中断时候对于缓冲区处理问题

这都是早期的操作系统吧? 不支持虚拟内存的情况. 现在你想指恐怕你都指不到. 如果你能的话告诉我方法.我也学学.



虚拟内存有什么关系,最终都要在实际的内存中
跟中断都没有关系,那些所谓的硬件的缓冲区是操作系统来处理的,也是在内存中,比如键盘缓冲(固陋寡闻,不是说硬件的那个,那个有没有都不需要考虑,是说键盘中断放字符码和扫描码的那个)
而这个缓冲跟scanf 的缓冲又不一样,这个是流的,流的缓冲区跟操作系统没有关系啊,操作系统提供的借口并没有给你缓冲,你要什么就给你什么,并告诉你在什么地方。

论坛徽章:
0
14 [报告]
发表于 2005-08-09 14:19 |只看该作者

新手提问:怎么用gets()只取Int值?

我的意思是跟操作系统没有关系,所以跟早期的操作系统也没有关系

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
15 [报告]
发表于 2005-08-09 14:49 |只看该作者

新手提问:怎么用gets()只取Int值?

>;>;虚拟内存有什么关系,最终都要在实际的内存中

虚拟内存 采用分页的机制.保证了 进程之前虽然看似用了相同的地址空间.却对应不同的实际物理内存空间. 所以证明了 它想指也指不到.

renxiaolin_jsj  所说的意思 不知道kukucm  看明白了没有.

kukucm 不知道你对scanf("%d",b); 能理解到多少? 我感觉你没有理解.

第2个参数 一个地址. renxiaolin_jsj 的意思是 这里没用&b.那么该地址就应该是b 的内容所对应的一个不知道是什么的地址. 假设b的值是1. 那么将会把从键盘输入的数放到0x00000001 这个地址对应的内存中. 他是这个意思.会导致什么硬件........什么的.
我告诉他不会有这个问题. 而且告诉他如果加上-Wall编译的话 会看到警告.
为什么和虚拟内存没关系?


请指教.

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
16 [报告]
发表于 2005-08-09 14:55 |只看该作者

新手提问:怎么用gets()只取Int值?

早期的操作系统没有采用这种技术. 虚拟内存的技术.所以可能存在renxiaolin_jsj 所说的问题.

为什么和 早期的操作系统还无关?? 请kukucm  指教.

论坛徽章:
0
17 [报告]
发表于 2005-08-09 17:52 |只看该作者

新手提问:怎么用gets()只取Int值?

虚拟内存 采用分页的机制.保证了 进程之前虽然看似用了相同的地址空间.却对应不同的实际物理内存空间. 所以证明了 它想指也指不到.


//是我误会了你的意思,我明白你的意思

renxiaolin_jsj  所说的意思 不知道kukucm  看明白了没有.

//我明白了

kukucm 不知道你对scanf("%d",b); 能理解到多少? 我感觉你没有理解.


//我只看过几遍scanf的代码,来自minix。不懂多少。





一个地址. renxiaolin_jsj 的意思是 这里没用&b.那么该地址就应该是b 的内容所对应的一个不知道是什么的地址. 假设b的值是1. 那么将会把从键盘输入的数放到0x00000001 这个地址对应的内存中. 他是这个意思.会导致什么硬件........什么的.
我告诉他不会有这个问题. 而且告诉他如果加上-Wall编译的话 会看到警告.
为什么和虚拟内存没关系?



//mq110,这都是早期的操作系统吧? 不支持虚拟内存的情况.能讲讲区别吗  


main(){
int b;

while(1)
{
printf("*";
scanf("%d",b);
}
}


这都是早期的操作系统吧? 不支持虚拟内存的情况.
//我感觉你说的意思好象是 :现在的操作系统对于这种情况都没有关系的。只是线性地址。不是实际的地址。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
18 [报告]
发表于 2005-08-09 18:09 |只看该作者

新手提问:怎么用gets()只取Int值?

或许我也理解错了renxiaolin_jsj的意思. 网上文字的表述 有的时候会让人误解的.
如果我有说错的地方请指教.

不过他写的那段程序确实有问题.

虚拟内存采用分页机制. 对于一个32位的虚拟地址来说.

下面这个图片能说明一下 分页机制.

1.JPG (21.84 KB, 下载次数: 36)

1.JPG
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP