Chinaunix首页 | 论坛 | 博客
  • 博客访问: 25805
  • 博文数量: 4
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2013-04-16 20:52
文章分类
文章存档

2013年(4)

我的朋友

分类: 嵌入式

2013-05-09 11:59:38

#include

int main()
{
int first_count;
int second_count;

   printf("Jamsa%n's 1001 C & C++ Tips%n\n", &first_count,
     &second_count);

   printf("First count %d Second count %d\n", first_count,
     second_count);
}


%n与其他格式说明符号不同。%n不向printf传递格式化信息,而是令printf把自己到该点已打出的字符总数放到相应变元指向的整形变量中。
在第一个%n前为Jamsa,5个字符,因此first_count=5;在第二个%n前是Jamsa's 1001 C & C++ Tips,字符数是25。



%n将本次scanf()调用到%n之前所读取的字符数量(而不是变量个数)存储到对应的变量中,例如:

//---------------------------------------------------------------------------

#include

int main(void)
{
 int n, a;
 scanf("%d%n",&a,&n);
 printf("%d\n",n);
 return 0;
}
//---------------------------------------------------------------------------

这个程序中的scanf()调用只要求输入一个整数,即%d对应的a变量,然后就把总共输入的字符数量保存到n变量中,例如如果输入是101这个整数,那么因为这个整数有3位,所以,scanf()会把3保存到n变量中。


*************************************************************************************************

扫描集是用于字符串读取的一个工具,它可以比%s更灵活地控制读取过程,具体如下:

%[]的中括号中需要填写一个正则表达式,用于指明只读取那些字符或者不读取那些字符,

当中括号内的内容不是以^开头的时候,表示只读取在中括号中出现的内容,当遇到第一个没有出现的字符时,就停止读取,并把目前已经读取的内容保存到对应的字符数组中,例如:

char a[80];
scanf("%[0-9]",a); //只读取数字。

假设输入为:
123a456
那么上面的scanf()将把123读取并保存到a数组中,其余的a456将遗留在缓冲区中。

如果把上面的scanf()调用改为如下形式:

scanf("%[13579]",a);

并且输入如下:

123

那么将只读取1,并把它做为字符串保存到a 中,其余字符将遗留在缓冲区中,因为第二个字符'2‘没有出现在扫描集中,所以不再继续读取。

如果扫描集的第一个字符是^,那么读取规则就变成了只读取没有出现在扫描集中的字符,遇到第一个出现在扫描集中的字符时,读取即告停止,例如:

scanf("%[^0-9]",a);

这个调用将只读取非数字字符,遇到数字字符时读取停止,如果输入的是:

abc009icp

那么将读取abc到a数组,其余的字符将遗留在缓冲区中

阅读(782) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~