读书人

关于scanf中%n的计数原理有关问题

发布时间: 2014-05-31 16:25:08 作者: rapoo

关于scanf中%n的计数原理问题
初次了解scanf的%n,对其甚是不解


int a, b, n;
scanf("%d %d%n", &a, &b, &n);
printf("%d %d %d", a, b, n);

上面这个代码
Input:
1234 56789
Output:
1234 56789 10

而在%n前加一个空格,变为

int a, b, n;
scanf("%d %d %n", &a, &b, &n);
printf("%d %d %d", a, b, n);

却需要多输入一组数字?而且n的值会随着第二个数字和第三个数字间的空格(或者回车)数量而增加
Input:
1234 56789 5
Output:
1234 56789 11
若其间增加空格或者回车,则:
Input:
1234 56789 55 (中间共6个空格)
Output:
1234 56789 16
--------------------------------------------------------------
我想请问下这是为什么?那个%n的计数原理又是怎样的?

[解决办法]
引用:
Quote: 引用:

printf中%n 表示至此已读入值的等价字符数。

scanf中的%n好像也是这个意思,可是那个%n的有效字符数是怎么算的呢?我输入1234和56789,它显示一共读取了10个字符,那第十个字符是中间那个空格还是最后的回车?
而且我在%n前加个空格,它又会要求我多输入一个字符,这又是为什么呢?

第十个字符是最后的回车。%n是紧跟%d之后的,你中间加了个空格,编译器就会误认为%n是像%d这样的参数,所以才会让你再输入一个。像你一开始的scanf("%d %d%n", &a, &b, &n); scanf的返回值是2而不是3。
[解决办法]

http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express
点开Visual C++ 2010 Express下面的语言选‘简体中文’,再点立即安装

再参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\input.c
   1125:                     case _T('n') :      /* char count, don't inc return value */
1126: number = charcount;
1127: if(!suppress)
1128: goto assign_num; /* found in number code above */
1129: break;

[解决办法]
上面赵老师已经给了scanf的源码,意思也是差不多的,本次scanf到目前为止输入了多少字符,而每次读取一个数据的时候会把后面连带的空格、tab等空白符算进去。

读书人网 >C++

热点推荐