首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2014-05-31 
关于scanf中%n的计数原理问题初次了解scanf的%n,对其甚是不解int a, b, nscanf(%d %d%n, &a, &b, &n)p

关于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等空白符算进去。

热点排行