关于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的计数原理又是怎样的?
[解决办法]
第十个字符是最后的回车。%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等空白符算进去。