Chinaunix首页 | 论坛 | 博客
  • 博客访问: 398973
  • 博文数量: 75
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 645
  • 用 户 组: 普通用户
  • 注册时间: 2015-06-03 18:24
文章分类

全部博文(75)

文章存档

2019年(1)

2018年(20)

2017年(14)

2016年(10)

2015年(30)

分类: LINUX

2015-08-01 12:29:21

      相信很多学过C语言的人,对于scanf函数应该都非常的熟悉。但我相信却很少人会用到sscanf函数。至少对于我来说,在大学期间我都不知道有这个函数。那这个函数到底有什么用途呢?下面让我们问一下像男人一样在背后支持我们的man手册。
scanf函数是从标准输入流中读取数据,而sscanf是从字符串指针str中读取数据。这就是它们最显而易见的区别!题外话不说那么多了,还是赶紧进入正题了。

下面通过几个例子让我们对这个函数有一个更进一步的了解。
1、

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     char buf[10];
  5.     int i;
  6.     for(i = 0;i < 10;i++)
  7.     {
  8.         buf[i] = '*';
  9.     }

  10.     printf("before:");
  11.     for(i = 0;i < 10;i++)
  12.     {
  13.         printf("%c",buf[i]);
  14.     }
  15.     printf("\n");

  16.     sscanf("abcde","%s",buf);

  17.     printf(" after:");
  18.     for(i = 0;i < 10;i++)
  19.     {
  20.         printf("%c",buf[i]);
  21.     }
  22.     printf("\n");
  23.     return 0;
  24. }
这段代码首先是将一个有十个元素的字符数组全部初始化为‘*’,然后通过sscanf输入“abcde”以%s的格式输入到buf中,然后通过打印之前buf里面的内容和打印调用sscanf之后buf里面的内容。
执行后的结果为:

但是通过观察,好像after之后好像只打印了9个字符,还有一个字符去哪里呢?其实在字符串“abcde”中存放的内容是abcde\0,\0是字符串的结束标志。这里sscanf的作用就是将字符串“abcde”以%s的格式输入buf中,然后buf中的钱六个字符就变成了abcde\0了。

2、

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     char buf[10];
  5.     int i;
  6.     for(i = 0;i < 10;i++)
  7.     {
  8.         buf[i] = '*';
  9.     }

  10.     printf("before:");
  11.     for(i = 0;i < 10;i++)
  12.     {
  13.         printf("%c",buf[i]);
  14.     }
  15.     printf("\n");

  16.     sscanf("abcde","%3s",buf);

  17.     printf(" after:");
  18.     for(i = 0;i < 10;i++)
  19.     {
  20.         printf("%c",buf[i]);
  21.     }
  22.     printf("\n");
  23.     return 0;
  24. }
这段代码和例子一的代码大部分都差不多,只有在scanf那个函数有点不同。
sscanf("abcde","%3s",buf);这条语句的意思就是将字符串“abcde”中的前三个字符以%s的格式输入到buf中。
执行后的结果为:


3、

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     char buf[10];
  5.     int i;
  6.     for(i = 0;i < 10;i++)
  7.     {
  8.         buf[i] = '*';
  9.     }

  10.     printf("before:");
  11.     for(i = 0;i < 10;i++)
  12.     {
  13.         printf("%c",buf[i]);
  14.     }
  15.     printf("\n");

  16.     sscanf("158iujh","%[1-9]",buf);

  17.     printf(" after:");
  18.     for(i = 0;i < 10;i++)
  19.     {
  20.         printf("%c",buf[i]);
  21.     }
  22.     printf("\n");
  23.     return 0;
  24. }
代码sscanf("158iujh","%[1-9]",buf);的意思就是将"158iujh"以"%[1-9]"这种格式输入到buf中,但是"%[1-9]"这种格式是一种什么格式呢?其实我对这种格式只是知道一点皮毛。要想深入了解,那大家就是去学一下正则表达式了!
"%[1-9]"这种格式就只输入str字符串中的‘1’到‘9’之间的字符。
执行后的结果为:


4、

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     char buf[10];
  5.     int i;
  6.     for(i = 0;i < 10;i++)
  7.     {
  8.         buf[i] = '*';
  9.     }

  10.     printf("before:");
  11.     for(i = 0;i < 10;i++)
  12.     {
  13.         printf("%c",buf[i]);
  14.     }
  15.     printf("\n");

  16.     sscanf("123ABC123","%[^A-Z]",buf);

  17.     printf(" after:");
  18.     for(i = 0;i < 10;i++)
  19.     {
  20.         printf("%c",buf[i]);
  21.     }
  22.     printf("\n");
  23.     return 0;
  24. }
代码sscanf("123ABC123","%[^A-Z]",buf);的意思也是将字符串"123ABC123"以"%[^A-Z]"格式输入到buf中。"%[^A-Z]"的意思就是输入的字符串不是A到Z之间的字符。
执行后的结果为:


5、

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     char buf[10];
  5.     int i;
  6.     for(i = 0;i < 10;i++)
  7.     {
  8.         buf[i] = '*';
  9.     }

  10.     printf("before:");
  11.     for(i = 0;i < 10;i++)
  12.     {
  13.         printf("%c",buf[i]);
  14.     }
  15.     printf("\n");

  16.     sscanf("abcABC123","%[a-z]%[A-Z]",buf);

  17.     printf(" after:");
  18.     for(i = 0;i < 10;i++)
  19.     {
  20.         printf("%c",buf[i]);
  21.     }
  22.     printf("\n");
  23.     return 0;
  24. }
sscanf("abcABC123","%[a-z]%[A-Z]",buf);当很多人看到这条语句的时候就会认为输出的结果是abcABC***,实践是检验真理的唯一标准。直接看执行后的结果吧:

发生段错误,相信很多在linux下编程的人肯定遇到很多这个问题吧!
通过这个例子,我们可以得出一个结论:%不可以连续使用两次以上。

6、

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     char buf[10];
  5.     int i;
  6.     for(i = 0;i < 10;i++)
  7.     {
  8.         buf[i] = '*';
  9.     }

  10.     printf("before:");
  11.     for(i = 0;i < 10;i++)
  12.     {
  13.         printf("%c",buf[i]);
  14.     }
  15.     printf("\n");

  16.     sscanf("abcABC123","%*[a-z]%*[A-Z]%s",buf);

  17.     printf(" after:");
  18.     for(i = 0;i < 10;i++)
  19.     {
  20.         printf("%c",buf[i]);
  21.     }
  22.     printf("\n");
  23.     return 0;
  24. }
sscanf("abcABC123","%*[a-z]%*[A-Z]%s",buf);  刚才上一个例子才说%不可以使用两次以上,但是在这里却使用了三次。这里不会也是段错误吧!
看执行后的结果吧!

和我们预测的不一样!"%*[a-z]%*[A-Z]%s"又有什么样的含义呢?其实这里是先过滤掉a到z,再过滤掉A到Z。再将剩余的字符以%s的格式输入到buf中。

7、

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     char buf[10];
  5.     int i;
  6.     for(i = 0;i < 10;i++)
  7.     {
  8.         buf[i] = '*';
  9.     }

  10.     printf("before:");
  11.     for(i = 0;i < 10;i++)
  12.     {
  13.         printf("%c",buf[i]);
  14.     }
  15.     printf("\n");

  16.     sscanf("abcABC123xyz==","%*[a-z]%*[A-Z]%[^a-z]",buf);

  17.     printf(" after:");
  18.     for(i = 0;i < 10;i++)
  19.     {
  20.         printf("%c",buf[i]);
  21.     }
  22.     printf("\n");
  23.     return 0;
  24. }
执行后的结果是:



     通过这几个实例,是不是感觉对sscanf有了进一步的了解,要想真正掌握它,就把它用在项目中去!多去实践,实践是检验真理的唯一标准!




阅读(1128) | 评论(0) | 转发(0) |
0

上一篇:linux进程间的通信--有名管道

下一篇:xml

给主人留下些什么吧!~~