论坛: 编程破解 标题: 输入数字时的定界符的问题[...] 复制本贴地址    
作者: TecZm [teczm]    版主   登录
程序这样可以
main()
{int a,b,c;
scanf("%d\n%d",&a,&b);
c=max(a,b);
printf("the max is %d\n",c);
    }
    int max (int x, int y)
    {int z;
    if (x>y) z=x;
    else z=y;
    return(z);
        }
要是把\n改为字符就可以,但是改为数字就不行了。
是不是可以这样认为:
如果取值为int,那么定界符就不能为int,其他可以?
同理,取值为char的话,定界符就不能为char,其他可以?




[此贴被 TecZm(teczm) 在 09月30日09时54分 编辑过]

地主 发表时间: 05-09-28 16:56

回复: TecZm [teczm]   版主   登录
另外
\n换成A 输入 123456A654321 得出:max is 654321
如果换成\64 输入 123456A654321 得出的仅是第一个值
为啥涅?

B1层 发表时间: 05-09-28 17:55

回复: Shell [f_h]   论坛用户   登录
晕。我连第一个结果都不是。

12
23
Max is 23
92C - Copyright (c) 1988 Borland Intl.
12
Max is 3117C - Copyright (c) 1988 Borland Intl.
121\A23
Max is 3117C - Copyright (c) 1988 Borland Intl.
12\65232
Max is 3117

格式字符串中不允许有转义字符


[此贴被 Shell(f_h) 在 09月29日08时15分 编辑过]

B2层 发表时间: 05-09-28 19:27

回复: TecZm [teczm]   版主   登录
其实我是想以某个指定的数字作为定界符,比如64

但是scanf("%d64%d",&a,&b); 是不行的。


B3层 发表时间: 05-09-29 08:33

回复: TecZm [teczm]   版主   登录
>>>格式字符串中不允许有转义字符

\n也是转义字符吧,为什么可以呢?

ps:我的编译器:cc gcc 和dev-c++(gcc for win)


B4层 发表时间: 05-09-29 08:51

回复: NetDemon [netdemon]   ADMIN   登录
整个读入,然后再自己拆分

B5层 发表时间: 05-09-29 08:51

回复: TecZm [teczm]   版主   登录
>>>整个读入,然后再自己拆分
这也算一种办法,但不是最好的;而且没有回答为什么scanf("%d,%d",&a,&b);语句中可以把逗号换成字符或\n,而不能换成数字的问题。

继续想啊

B6层 发表时间: 05-09-29 08:54

回复: 286 [unique]   版主   登录
晕人,让你看编译原理你就是不看。
用什么用定界符要看编译器里的有限自动机的设定。在识别时,只要是有效元都会被识别,只要是无效元,都会跳出识别。所以所有无效元都可以作为定界符。
不用的编译器(比如TC,VC,CC)也许用某个定界符,这个能通过,另一个就不一定能通过。

B7层 发表时间: 05-09-29 09:13

回复: kert_t8 [kert_t8]   论坛用户   登录
我错了我错了
引用:

常用的转义字符及其含义

转义字符 转义字符的意义
\n   回车换行
\t 横向跳到下一制表位置
\v  竖向跳格
\b 退格
\r  回车
\f  走纸换页
\\ 反斜线符"\"
\'  单引号符
\a  鸣铃
\ddd  1~3位八进制数所代表的字符
\xhh 1~2位十六进制数所代表的字符
 
  广义地讲,C语言字符集中的任何一个字符均可用转义字符来表示。表2.2中的\ddd和\xhh正是为此而提出的。ddd和hh分别为八进制和十六进制的ASCII代码。如\101表示字?quot;A" ,\102表示字母"B",\134表示反斜线,\XOA表示换行等。转义字符的使用。


你如果吧\64改成\102就可以用`B`作为定界符
如果改成\101就可以用`A`做定界符

我当时只记得\可以转义成ascii码,但是具体怎么转我就是瞎说的,算我恶心,给你赔罪

B8层 发表时间: 05-09-29 10:50

回复: kert_t8 [kert_t8]   论坛用户   登录
TecZm看好了!64是'A'么??? -----  当然,是不是A我都错了



B9层 发表时间: 05-09-29 11:05

回复: TecZm [teczm]   版主   登录
果然如此
scanf("%d\101%d",&a,&b); 可以

继续提问哦:
1. 如果以指定的数字作分界符 是不是 不行?
2. scanf("%d、040%d",&a,&b); 以空格作分界符时,无论1个空格或多个空格,在输入时都一样,我的问题是一个空格是\040两个空格怎么也是\040呢?
比如:
引用:
scanf("%d\040\040%d",&a,&b);

这句等同于
引用:
scanf("%d\040%d",&a,&b);



B10层 发表时间: 05-09-29 11:28

回复: TecZm [teczm]   版主   登录
3. scanf("%d\060%d",&a,&b);应该是以0为分界符吧,但是这样结果是不对的。 这个可以用有效元和无效元解释么?

B11层 发表时间: 05-09-29 11:33

回复: TecZm [teczm]   版主   登录
总结如下,大家看对不?

1. 取值为数字时,分界符不能为数字,但可以为其他字符。

2. scanf中取值分界符一个空格和2个空格是一样的。




[此贴被 TecZm(teczm) 在 09月30日09时54分 编辑过]

B12层 发表时间: 05-09-29 12:52

回复: ziaichen [ziaichen]   论坛用户   登录
不知道我下面的观点对不对
  scanf函数读取从键盘输入的数据时,若遇与格式要求不一致的字符,则认为与该字符说明对应的数据结束。
  格式控制串中的%d求输入的是连续的数字,若遇到非数字则将认为与该数字对应说明的数据整数读取结束,因此不难解释输入数字的问题,若含有其他的普通字符,输入数据时,这些字符不显示,而是要求这些字符也原样输入,例如scanf("%d,%d",&a,&b),如数数据这样输入 6,8
看下面的实例:
  scanf("%d%c%f",&a,&b,&c);
(1)执行该函数调用时,若输入:
1234x1234.5
则 a=1234 b=x.c=1234.5
(2)若输入:
1234空格x1234.5
则 a=1234 b=空格 c=0

所以不难解释:
1:语句:scanf("%d\n%d",&a,&b);
  其实你在输入数据的时候,先输入a后输入空格,后再输入b 和你这样输入:  输入a后回车再输入b的效果是一样的,也可以这样说:/n没有用
2:语句:\n换成A 输入 123456A654321 得出:max is 654321
  老师经常要我们采用这种格式 scanf("%d,%d",&a,&b),是因为"%d,%d"中的,起着格式说明的作用,当遇到,表明前面第一个数据输入结束,因此你程序中A 和,的作用一样,而若没有格式说明的话,即scanf("%d%d",&a,&b),则数据输入结束要用空格。TAB或回车分隔。
3:如果换成\65或者其他同样形式 输入 123456A654321
如同此例:(2)若输入:
1234空格x1234.5
则 a=1234 b=空格 c=0
因为此时b的值为0,也就是说\065没用
4:scanf("%d\101%d",&a,&b);
  你说可以执行,个人认为b的值还是0
5:scanf("%d\060%d",&a,&b),他不是以0做分界符,\060没用
6: scanf("%d\040%d",&a,&b); 以空格作分界符时,无论1个空格或多个空格,在输入时都一样,我的问题是一个空格是\040两个空格怎么也是\040呢?
这里\040根本就不是代表空格,还有关于空格上面已经讲过,输入空格代表前面数据输入完成,因此你接输入无数个空格也是没作用的,因为这时候系统等待你输入下一个有效数据呢







[此贴被 漏鱼的网(ziaichen) 在 10月02日11时47分 编辑过]

B13层 发表时间: 05-10-02 11:06

回复: ziaichen [ziaichen]   论坛用户   登录
286大哥最近是不是很忙啊
也不来给大家讲讲一下

B14层 发表时间: 05-10-06 01:02

回复: TecZm [teczm]   版主   登录
楼上的楼上说的不错

B15层 发表时间: 05-10-08 11:14

回复: sweetblood [sweetblood]   论坛用户   登录
楼上的
也就是说你总结的不对哦

B16层 发表时间: 05-10-12 22:10

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号