有关scanf的一个问题
发布网友
发布时间:2024-09-26 22:05
我来回答
共4个回答
热心网友
时间:2024-11-26 20:44
scanf()函数根据由【format(格式)】指定的格式从stdin(标准输入)读取,并保存数据到【其它参数】.
【format(格式)字符串】由
【控制字符(控制字符以一个%符号开始,如%d,%c)】和
【空白字符(如空格,tab)】和
【非空白字符】组成.
scanf()读取匹配【format(格式)字符串】的输入.
当读取到一个【控制字符】, 它把值放置到【下一个变量】. 特别的,"*"加在任何项的前面表示该项不赋值,如%*c不会赋值任何变量
【空白字符】会【跳过】.
【非空白字符】和【输入匹配, 然后丢弃】.
scanf()的返回值是成功赋值的变量数量, 发生错误时返回EOF.
--------------------------------------------------------------------------------
语句:scanf("%d%*c%d %*c%d",&date,&month,&year);
现在 scanf的format(格式)字符串为:"%d%*c%d %*c%d" 。
第一个%d为【控制字符】,【匹配一个数字】(即数字0-9的组合)。匹配结果【赋值给变量 date】
第一个%*c为【控制字符】,匹配【任意一个字符】,但是【不赋值给任何变量】!!!。
这里的任意字符本来也【包括数字字符 0-9】,但是因为 %c 前面有%d,
即使有数字字符,已经被 %d 给匹配掉了。
所以这里的 %*c 实际是匹配一个【除了数字字符 0-9 以外】的任意字符。
第一个%d为【控制字符】,【匹配一个数字】(即数字0-9的组合)。匹配结果【赋值给变量 month】
第一个【空白字符】(空格)被忽略,【不匹配任何字符】
第二个%*c为【控制字符】,匹配【任意一个字符】。
【注意】:第二个 %*c 和 第一个%*c为【不同】!
因为第一个 %*c 前面是 %d ,因此%*c 实际是匹配一个【除了数字字符 0-9 以外】的任意字符。
因为第二个 %*c 前面是【空白字符】 ,因此%*c 实际是匹配任意字符,【包括数字字符 0-9 】。
第二个%d为【控制字符】,【匹配一个数字】(即数字0-9的组合)。匹配结果【赋值给变量 year】
--------------------------------------------------------------------------------
原始:scanf("%d%*c%d %*c%d",&date,&month,&year);
输入:"23 2 2001"
输入【23】 匹配 :【格式第一个%d】 ,date = 23
输入【空格】被匹配:【格式第一个%*c】 ,匹配结果不存入任何变量。
输入【2】匹配:【格式第二个%d】 , month=2
输入【空格】被舍弃。【格式第一个空格】跳过
输入【2001的首位数字“2”】匹配:【格式第二个%*c】 ,匹配结果不存入任何变量
输入【2001的除首位数字“2”部分 001】匹配:【格式第二个%d】,year = 001 = 1
--------------------------------------------------------------------------------
去掉空格:scanf("%d%*c%d%*c%d",&date,&month,&year);
输入:"23 2 2001"
输入【23】 匹配 :【格式第一个%d】 ,date = 23
输入【空格】被匹配:【格式第一个%*c】 ,匹配结果不存入任何变量。
输入【2】匹配:【格式第二个%d】 , month=2
输入【空格】被匹配:【格式第二个%*c】 ,匹配结果不存入任何变量。
输入【2001】匹配:【格式第二个%d】,year = 2001
--------------------------------------------------------------------------------
空格弄在%*c后面:scanf("%d%*c%d%*c %d",&date,&month,&year);
输入:23 2 2001
输入【23】 匹配 :【格式第一个%d】 ,date = 23
输入【空格】被匹配:【格式第一个%*c】 ,匹配结果不存入任何变量。
输入【2】匹配:【格式第二个%d】 , month=2
输入【空格】被匹配:【格式第二个%*c】 ,匹配结果不存入任何变量。
【格式第一个空格】跳过,不匹配任何输入
输入【2001】匹配:【格式第二个%d】,year = 2001
热心网友
时间:2024-11-26 20:45
这好像跟你的输入有关,在 scanf("%d%*c%d %*c%d",&date,&month,&year);这一语句之后,输入23 2 2001 ,则23取入第一个%d ,被输入的第一个空格取入,2取入第二个%d,输入的第二个空格与输入语句中的空格对应,然后2可能就被取入第三个%*c,最后001取入第三个%d,所以输出是year=1。
热心网友
时间:2024-11-26 20:45
1、%*C表示读指定的数据但不保存。
2、最后一个占位符前面的空格占位符可以忽略掉。
热心网友
时间:2024-11-26 20:46
注意 %*c的作用是忽略一个字符
你输入23 2 2001 会产生23 2 1的原因是这样的:
%d读了23
然后%c忽略了空格
然后%d读了2
注意 此时你scanf里有空格 所以2后的空格被空格代替
接着%c忽略了2
%d 读了001 也就是1
所以结果是 23 2 1
如果把空格放后面同理分析