黑马程序员技术交流社区

标题: 今天再看学校的c语言复习资料,一个关于指针的小问题 [打印本页]

作者: hx小龙    时间: 2014-6-5 17:59
标题: 今天再看学校的c语言复习资料,一个关于指针的小问题
本帖最后由 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中除了匹配符以外的字符要全部严格匹配接收。



作者: 夏沫的黄昏′    时间: 2014-6-5 18:48
#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
作者: 每天进步一点点    时间: 2014-6-5 18:59
scanf函数中占位符后面是不能跟\n的,这是格式,要遵守。
作者: 54hxd52lj    时间: 2014-6-5 19:15
输入函数不用加换行符“\n”的。
作者: bubuatt    时间: 2014-6-5 20:34
同上,scanf中是不能出现\n的
作者: ★Joean_Zhou    时间: 2014-6-5 21:07
同上不能出现\n
作者: wanzhu159    时间: 2014-6-5 21:17
scanf遇到空格就不会再往下读了......
作者: tony_ygz    时间: 2014-6-6 08:43
scanf里面不加\n

作者: 魑魅魍魉121    时间: 2014-6-6 09:01
scanf函数中占位符后面是不能跟\n的,要是加上了\n在输入的时候也要格式一样加上\n
作者: hx小龙    时间: 2014-6-12 13:57
夏沫的黄昏′ 发表于 2014-6-5 18:48
#include

int main()

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

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

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

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

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

是可以加,我那天试了下。加上以后只要对准“\n”也就结束了。完全匹配“\n”就行
作者: hx小龙    时间: 2014-6-18 00:12
武星 发表于 2014-6-12 21:43
可以这样理解

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

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

对啊,关键原理是什么,我是挺好奇原理的
作者: 邱蚓    时间: 2014-6-18 00:25
scanf里面不加\n
作者: 各有千秋    时间: 2014-10-13 13:29
换行出问题了:lol




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2