相信很多学过C语言的人,对于scanf函数应该都非常的熟悉。但我相信却很少人会用到sscanf函数。至少对于我来说,在大学期间我都不知道有这个函数。那这个函数到底有什么用途呢?下面让我们问一下像男人一样在背后支持我们的man手册。
scanf函数是从标准输入流中读取数据,而sscanf是从字符串指针str中读取数据。这就是它们最显而易见的区别!题外话不说那么多了,还是赶紧进入正题了。
下面通过几个例子让我们对这个函数有一个更进一步的了解。
1、
-
#include <stdio.h>
-
-
int main(void)
-
{
-
char buf[10];
-
int i;
-
for(i = 0;i < 10;i++)
-
{
-
buf[i] = '*';
-
}
-
-
printf("before:");
-
for(i = 0;i < 10;i++)
-
{
-
printf("%c",buf[i]);
-
}
-
printf("\n");
-
-
sscanf("abcde","%s",buf);
-
-
printf(" after:");
-
for(i = 0;i < 10;i++)
-
{
-
printf("%c",buf[i]);
-
}
-
printf("\n");
-
return 0;
-
}
这段代码首先是将一个有十个元素的字符数组全部初始化为‘*’,然后通过sscanf输入“abcde”以%s的格式输入到buf中,然后通过打印之前buf里面的内容和打印调用sscanf之后buf里面的内容。
执行后的结果为:
但是通过观察,好像after之后好像只打印了9个字符,还有一个字符去哪里呢?其实在字符串“abcde”中存放的内容是abcde\0,\0是字符串的结束标志。这里sscanf的作用就是将字符串“abcde”以%s的格式输入buf中,然后buf中的钱六个字符就变成了abcde\0了。
2、
-
#include <stdio.h>
-
-
int main(void)
-
{
-
char buf[10];
-
int i;
-
for(i = 0;i < 10;i++)
-
{
-
buf[i] = '*';
-
}
-
-
printf("before:");
-
for(i = 0;i < 10;i++)
-
{
-
printf("%c",buf[i]);
-
}
-
printf("\n");
-
-
sscanf("abcde","%3s",buf);
-
-
printf(" after:");
-
for(i = 0;i < 10;i++)
-
{
-
printf("%c",buf[i]);
-
}
-
printf("\n");
-
return 0;
-
}
这段代码和例子一的代码大部分都差不多,只有在scanf那个函数有点不同。
sscanf("abcde","%3s",buf);这条语句的意思就是将字符串“abcde”中的前三个字符以%s的格式输入到buf中。
执行后的结果为:
3、
-
#include <stdio.h>
-
-
int main(void)
-
{
-
char buf[10];
-
int i;
-
for(i = 0;i < 10;i++)
-
{
-
buf[i] = '*';
-
}
-
-
printf("before:");
-
for(i = 0;i < 10;i++)
-
{
-
printf("%c",buf[i]);
-
}
-
printf("\n");
-
-
sscanf("158iujh","%[1-9]",buf);
-
-
printf(" after:");
-
for(i = 0;i < 10;i++)
-
{
-
printf("%c",buf[i]);
-
}
-
printf("\n");
-
return 0;
-
}
代码sscanf("158iujh","%[1-9]",buf);的意思就是将
"158iujh"以"%[1-9]"这种格式输入到buf中,但是"%[1-9]"这种格式是一种什么格式呢?其实我对这种格式只是知道一点皮毛。要想深入了解,那大家就是去学一下正则表达式了!
"%[1-9]"这种格式就只输入str字符串中的‘1’到‘9’之间的字符。
执行后的结果为:
4、
-
#include <stdio.h>
-
-
int main(void)
-
{
-
char buf[10];
-
int i;
-
for(i = 0;i < 10;i++)
-
{
-
buf[i] = '*';
-
}
-
-
printf("before:");
-
for(i = 0;i < 10;i++)
-
{
-
printf("%c",buf[i]);
-
}
-
printf("\n");
-
-
sscanf("123ABC123","%[^A-Z]",buf);
-
-
printf(" after:");
-
for(i = 0;i < 10;i++)
-
{
-
printf("%c",buf[i]);
-
}
-
printf("\n");
-
return 0;
-
}
代码sscanf("123ABC123","%[^A-Z]",buf);的意思也是将字符串"123ABC123"以"%[^A-Z]"格式输入到buf中。
"%[^A-Z]"的意思就是输入的字符串不是A到Z之间的字符。
执行后的结果为:
5、
-
#include <stdio.h>
-
-
int main(void)
-
{
-
char buf[10];
-
int i;
-
for(i = 0;i < 10;i++)
-
{
-
buf[i] = '*';
-
}
-
-
printf("before:");
-
for(i = 0;i < 10;i++)
-
{
-
printf("%c",buf[i]);
-
}
-
printf("\n");
-
-
sscanf("abcABC123","%[a-z]%[A-Z]",buf);
-
-
printf(" after:");
-
for(i = 0;i < 10;i++)
-
{
-
printf("%c",buf[i]);
-
}
-
printf("\n");
-
return 0;
-
}
sscanf("abcABC123","%[a-z]%[A-Z]",buf);当很多人看到这条语句的时候就会认为输出的结果是abcABC***,实践是检验真理的唯一标准。直接看执行后的结果吧:
发生段错误,相信很多在linux下编程的人肯定遇到很多这个问题吧!
通过这个例子,我们可以得出一个结论:%不可以连续使用两次以上。
6、
-
#include <stdio.h>
-
-
int main(void)
-
{
-
char buf[10];
-
int i;
-
for(i = 0;i < 10;i++)
-
{
-
buf[i] = '*';
-
}
-
-
printf("before:");
-
for(i = 0;i < 10;i++)
-
{
-
printf("%c",buf[i]);
-
}
-
printf("\n");
-
-
sscanf("abcABC123","%*[a-z]%*[A-Z]%s",buf);
-
-
printf(" after:");
-
for(i = 0;i < 10;i++)
-
{
-
printf("%c",buf[i]);
-
}
-
printf("\n");
-
return 0;
-
}
sscanf("abcABC123","%*[a-z]%*[A-Z]%s",buf); 刚才上一个例子才说%不可以使用两次以上,但是在这里却使用了三次。这里不会也是段错误吧!
看执行后的结果吧!
和我们预测的不一样!"%*[a-z]%*[A-Z]%s"又有什么样的含义呢?其实这里是先过滤掉a到z,再过滤掉A到Z。再将剩余的字符以%s的格式输入到buf中。
7、
-
#include <stdio.h>
-
-
int main(void)
-
{
-
char buf[10];
-
int i;
-
for(i = 0;i < 10;i++)
-
{
-
buf[i] = '*';
-
}
-
-
printf("before:");
-
for(i = 0;i < 10;i++)
-
{
-
printf("%c",buf[i]);
-
}
-
printf("\n");
-
-
sscanf("abcABC123xyz==","%*[a-z]%*[A-Z]%[^a-z]",buf);
-
-
printf(" after:");
-
for(i = 0;i < 10;i++)
-
{
-
printf("%c",buf[i]);
-
}
-
printf("\n");
-
return 0;
-
}
执行后的结果是:
通过这几个实例,是不是感觉对sscanf有了进一步的了解,要想真正掌握它,就把它用在项目中去!多去实践,实践是检验真理的唯一标准!
阅读(1128) | 评论(0) | 转发(0) |