| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 982 人关注过本帖
标题:scanf函数问题
只看楼主 加入收藏
zmrfff
Rank: 1
等 级:新手上路
帖 子:64
专家分:0
注 册:2008-10-21
结帖率:95.83%
收藏
已结贴  问题点数:20 回复次数:8 
scanf函数问题
做了几道笔试题,百思不得其解,特地请教高手们,请多多指点,谢谢啦!
1、
#include <stdio.h>
void main()
{
    int m=0,n=0;char c='a';
    scanf("%d%c%d",&m,&c,&n);
    printf("%d,%c,%d\n",m,c,n);   
}
输入10A10回车后,结果是10,A,10 我觉得应该是10,a,10呀,想不通。
还有,如果我输入10 A 10,结果为10, ,0 更头大><
2、
d="\0127";我认为这条赋值语句不对。但答案说是对的。但转义字符8进制数的格式为\ddd,意为1至3位8进制数所代表的字符,但此\后有4位,我哪里分析错了呢?
3、如果已对指针变量p赋值NULL,即p=NUll;那么是否不能对p赋别的值?NULL是整数0,也就是使p指向地址为0的单元,那么*p=0;这条语句哪里错了呢?
4、#include <stdio.h>
void main()
{
    int p,a=5;
    if(p=a!=0)
    printf("%d\n",p);
    else
    printf("%d\n",p+2);
}
我分析p值为5,但一上机运行,结果为1,汗,不知道为什么。
根据运算优先级,在(p=a!=0)中先判断a!=0,然后再将结果赋值给p,a=5,所以p=5,哪里分析错了呢?请指点,万分谢谢!
搜索更多相关主题的帖子: 函数 scanf 
2009-09-03 23:14
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:7 
第一题:
int m=0,n=0;char c='a';   /*这是赋初值,m,n,c都是变量,后面一有改动,值也变。*/
scanf("%d%c%d",&m,&c,&n); /* 如输入:10A10 m=10,c='A',n=10,m,n,c都重新赋值,输出就是:10,A,10*/
(如输入10 A 10  10赋给m,' '空格赋给c,'A'赋n格式不对,n还是原来的0值,输出:10, ,0)
·
第二题:
d="\0127";/* 0127 常量时以数字0开头是代表八进字,在字符串里就要用到转义字符“\0127",'\0'后的127是八进字,127八进字三位。 */
·
第三题:
*p=0; /* 是让指针p不指向任何地址,当然不能赋值 */
·
第四题:
a=5
if(p=a!=0)   /* 可看做if(p=(a!=0)),a等于5,(a!=0)为真1,p=1,输出p值就是:1 */

努力—前进—变老—退休—入土
2009-09-03 23:51
prankmoon
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:161
专家分:921
注 册:2009-7-21
收藏
得分:8 
1. 当你输入"10A10",输出"10,A,10"是正确的,因为你输入的是大写字母'A',所以,c当然也就是大写了,而不应该是小写;
当你输入"10 A 10",对于变量m,它先获取尽可能多的数字,遇到非数字则认为输入完毕,此时对应于m等于10;对于变量c,它获取m后的字符,因为第一个10后面是空格" ",所以,c得到的是空格;对于n,本应获取c后的数字,但因为你c后又是一空格" ",而空格不被认为是合法数字,所以n放弃了这个空格,因此n保留了原来的值,也就是初始化时的0。
                                                                       .
2. 不知道你这个d是什么变量类型,这里假设它为字符串类型。不妨用下面一段代码来进行说明:
char d[] = "\0127";
其中"\012"会被解释为八进制的012,也就是十进制的10,十六进制的A;对于'7',则原样输出。所以在内存中d的值就是:
0012FF7C  0A 37 00
如果用printf("%s", d)的话就是一个换行(0x0A),然后下一行会打印一个7。而不是八进制的127。
                                                                       .
3. 楼上已经回答了。
                                                                       .
4. 主要是在这个判断上:"p=a!=0"。
因为赋值操作符"="的优先级比条件操作符"!="要低(赋值操作符仅比逗号操作符","高,低于其它所有的操作符),所以,"p=a!=0"等价于"p = (a != 0)",而条件运算"a != 0"为真(1),所以p的结果就是条件运算的结果1了。

[ 本帖最后由 prankmoon 于 2009-9-4 00:27 编辑 ]
2009-09-04 00:05
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:0 
第二题总觉得哪不对,你抄错了吧。应该是d='\0127'.
如d定义为整型,
d="\0127"; /* 上机调试是可以运行,但赋的值是不对的。*/
·
d='\0127';    /* 这样赋值是正确的, */
printf("%c %d %o\n",d,d,d);  /* 输出:W 87 127  */

努力—前进—变老—退休—入土
2009-09-04 00:51
prankmoon
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:161
专家分:921
注 册:2009-7-21
收藏
得分:5 
第二题:
下面假设d为int型,测试环境为VC6 + Debug方式:
程序代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int d = '\0127';
    printf("%d\n", d);

    return 0;
}

输出:
2615
                                                                     .
上段代码在linux + GCC 4.3.3下编译时会提示:
warning: multi-character character constant
但运行结果还是2615(十六进制的0x0A37)。
                                                                     .
如果d是char类型,则不同的编译器可能有不同的处理方法,下面是VC6 + Debug方式的代码和结果:
程序代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
    char d = '\0127';
    printf("%c\n", d);

    return 0;
}

输出:
7
在linux下同样会有编译警告,但运行的结果同样是7。
注:7这个结果并不可靠。因为有的编译器(如Borland C++ v5.5和LCC v3.6)仅取前面的八进制'\012'(十进制的10,十六进制的0x0A),也就是说,仅取第一个字符,这样d的值就是0x0A,打印的结果也就仅仅是一个换行符而已。而有的编译器(如VC6和GCC4.3.3)则依次使用后一个字符覆盖前一个字符,最后得到的整数值即最后一个字符的整数值,因此,打印的结果是7(十六进制的0x37)。关于这点《C陷阱与缺陷》中文版1.5节有讲。
                                                                     .
其实,这里理解的关键是\012中的0自身就是八进制的有效数字,而不是八进制的标识,因此\012就等于十进制的10,十六进制的0x0A。\0127中的八进制与后面的7一点关系都没有,仅仅与前面的\012有关。不妨测试\112,即是等于十进制的74,十六进制的0x4A。
                                                                     .
对于楼上的代码,在VC6 + Debug方式下的测试如下:
程序代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int d='\0127';
    printf("%c %d %o\n",d,d,d);
  
    return 0;
}

输出:
7 2615 5067

[ 本帖最后由 prankmoon 于 2009-9-4 01:52 编辑 ]
2009-09-04 01:40
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:0 
回复 5楼 prankmoon
受教了,写得很详细,3Q!
·
b='\0127'或b='\127'我在TC上测试都正常,
printf("%c %d %o\n",d,d,d);输出是W 87 127
·
在测试:b='\000127',TC也能正常输出W 87 127
·
别的编译器结果不同区别就在对于'\'转义字符的八进字处理上。

努力—前进—变老—退休—入土
2009-09-04 10:03
zmrfff
Rank: 1
等 级:新手上路
帖 子:64
专家分:0
注 册:2008-10-21
收藏
得分:0 
诸位对c的理解都很深刻,我明白了!谢谢^^
2009-09-05 13:08
zmrfff
Rank: 1
等 级:新手上路
帖 子:64
专家分:0
注 册:2008-10-21
收藏
得分:0 
诸位对c的理解都很深刻,我明白了!谢谢^^
2009-09-05 13:08
h_7226068
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2009-7-3
收藏
得分:0 
一楼正解!
2009-09-05 16:32
快速回复:scanf函数问题
数据加载中...
 
   



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

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