A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 hx小龙 于 2014-6-18 00:20 编辑

#include <stdio.h>

void main()
{
        int a,b,*p,*q;
        p = &a;
        q = &b;
        scanf("%d,%d \n",p,q);
        printf("%d \n",*p>*q?a:b);

}

程序代码如上,伤心死了。这么简单的一个小程序都敲错了。关键是都不知错在哪,程序的要求是从键盘接收两个数,并用指针形式输出最大的那个数,我觉着我写的没错啊,但是输出的确是最小的,而且如果把条件运算符的a和b互换了,却是内存乱码!求大家解答



感觉16楼的答案挺正确的,尤其是这句话。。。。。.scanf中除了匹配符以外的字符要全部严格匹配接收。


评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

20 个回复

倒序浏览
#include <stdio.h>

int main()
{
    int a,b,*p,*q;
    p = &a;
    q = &b;
    scanf("%d,%d",p,q);
    printf("%d\n",*p>*q?a:b);

}
你试试看 scanf别加\n
回复 使用道具 举报
scanf函数中占位符后面是不能跟\n的,这是格式,要遵守。
回复 使用道具 举报
输入函数不用加换行符“\n”的。
回复 使用道具 举报
同上,scanf中是不能出现\n的
回复 使用道具 举报
同上不能出现\n
回复 使用道具 举报
scanf遇到空格就不会再往下读了......
回复 使用道具 举报
scanf里面不加\n
回复 使用道具 举报
scanf函数中占位符后面是不能跟\n的,要是加上了\n在输入的时候也要格式一样加上\n
回复 使用道具 举报

谢你了。因为我学的是java,但是学校这学期开c,所以我学的没那么细致,只知道scanf要严格匹配,刚才看下咱们这边的c,才看到,但是老师在视频中对这个问题的解释不是太细致,哥们 ,你说为什么不能加\n  有木有比较牛屌的解释?
回复 使用道具 举报
chain 中级黑马 2014-6-12 21:36:12
11#
scanf哪能加\n呢 视频里面说过的
回复 使用道具 举报
可以这样理解

scanf 本身期待一个 '\n' 来结束这此读取

你的输入放在行缓存中,这个缓存中的内容是这样的

比如你写了一个 scanf("%d\n",&n),当你输入一个数,假设你输入了2,2跟%d匹配,然后你又敲了回车,回车跟\n匹配,然后指针跑到\n后面去了, scanf没有看到它期待的\n(scanf认为你的输入回车匹配,需要到不匹配为止,所以继续等待读入) 所以它认为输入是没有结束的 ,就一直在等
回复 使用道具 举报
hx小龙 发表于 2014-6-12 13:57
谢你了。因为我学的是java,但是学校这学期开c,所以我学的没那么细致,只知道scanf要严格匹配,刚才看下 ...

其实可以加。。但是你加上的话,  你输入一个数后,它是不会立即显示的,要等再接收到一个非(空格、制表符、回车)的输入scanf语句才结束。
回复 使用道具 举报
scanf("%d,%d \n",p,q);
最好写成scanf("%d%d ",p,q);
\n是必须要去掉的,这个大家都说
,最好也去掉,因为有,时,输入两个数据时中间必须只能用,隔开,然后按enter键
如果去掉,后,输入两个数据时中间可以用空格、tab键、回车键把两个数隔开,最后按enter键
回复 使用道具 举报
楼上说的都很有道理
回复 使用道具 举报
理论上我认为,scanf()函数里面除了匹配符,其余所有的字符都要进行一一的输出。
你这里的 scanf("%d,%d \n",p,q);
那么你在控制台输入数据的时候,可以这样输入:  3,33 \n
                                                那么可以得到结果: 33
你这里的 ,  和 \n  是一个都不能省略的,至于上面说的在后面敲回车,我认为是不会有作用的,
我做了实验,不信 你也可以试试,实践才是硬道理。
回复 使用道具 举报
夏沫的黄昏′ 发表于 2014-6-12 22:10
其实可以加。。但是你加上的话,  你输入一个数后,它是不会立即显示的,要等再接收到一个非(空格、制表 ...

是可以加,我那天试了下。加上以后只要对准“\n”也就结束了。完全匹配“\n”就行
回复 使用道具 举报
武星 发表于 2014-6-12 21:43
可以这样理解

scanf 本身期待一个 '\n' 来结束这此读取

感觉你的解释是最好玩的,但是这么说又产生了另外一个问题,就是windows下换行符是\r\n,而linux下是\n他们是不同的换行符,所以也解释不开啊
回复 使用道具 举报
张宇清 发表于 2014-6-15 22:17
理论上我认为,scanf()函数里面除了匹配符,其余所有的字符都要进行一一的输出。
你这里的 scanf("%d,%d \n ...

对啊,关键原理是什么,我是挺好奇原理的
回复 使用道具 举报
scanf里面不加\n
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马