关于scanf函数debug无法通过的问题

来源:互联网 发布:python jsonrpc 编辑:程序博客网 时间:2024/04/28 20:33

  今天遇到scanf函数,我试着写了一行简短的代码测试它的特性,发现在mac下,debug时候,在控制台输入数字,老是无法成功赋值。然后我在windows下试了一下,发现run和run and debug,两个指令都能成功通过。觉得应该不是代码的问题。然后我尝试在mac上run,而不再是run and debug,结果输入数字,竟然成功了,那现在在mac下,依旧无法调试scanf函数啊!!!永远卡在控制台处。

(解决:scanf函数要求输入严格匹配控制的形式,比如scanf("%d++%d=       %d ",&a, &b, &c),那么键盘输入只能如下:12++13=14     abc的值分别为12,13,14

如果输入:12#1314     那么,abc的值分别为12,0,0,因为#与-不匹配,scanf函数就马上退出返回了。

ps:格式串的一个或者多个空格,对输入没有影响。不参与匹配。 


PS:建议大家这样使用:

puts("请输入a的值: \n");

 scanf("%d",&a);

(scanf工作原理:将键盘输入的内容放入缓冲区,敲下回车键后,将内容一一匹配,赋值存入a指向的内存地址,如果匹配不一致,即可返回)

顺带说一下getchar和getch, scanf的区别:

getchar()存在于标准库函数<stdlib.h>中,原理是将键盘输入(标准输入)放入缓冲区中,回车后开始赋值取出,关键在于:每次取出一个字符,依次取出。内部机制是:输入的字符存在缓存里面,通过指针取出,每调用一次该函数次取出一个字符,指针往后移一位。

举例子:第一调用getchar,输入ab\n,返回'a';

第二次调用getchar,不需要你输入,自动取出'b';

第三次调用,自动取出'\n'。


getch()不属于标准函数库,原理是:输入一个字符,不需要回车,即可获取该字符,直接将该字符赋值给内存。

内部的机制:如果输入不是EOF,那就继续(未完待续.....)


scanf()是标准函数库的,带有格式控制符号,相比之下比较复杂,因为它要分辨各种类型的输入int ,long, double等等。对输入的要求非常严格。


char array[ ];

scanf("%d%s", &a, array)

输入:12ccc   得到  a为12,array 为ccc

输入:aaa12ccc  得到 a为12,array 为ccc

解释:aaa不匹配 %d所以被scanf 抛弃。



这样就不会出现问题了!

 ps:我发现又一次我把scanf写成了sacnf,竟然也编译通过了,可能是scanf函数是在链接阶段才加入进来的,所以编译时候检查不出错误。


我使用ide编程无论是visual studio 2013还是codelite,感觉退出控制台的时候,总是很卡,我的macbookair是固态硬盘,按理应该不会卡,可是现在写个小程序退出运行的时候都会卡一下,感觉是不是用命令行编译运行会更快一些?毕竟如果以后的写大程序更加卡的话,我会崩溃的。

现在改用xcode6了。

0 0
原创粉丝点击