c标准库提供的格式化输出函数:
int scanf(const char *format, ...);
其它family 函数:
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);
scanf最令人兴奋的地方就在于 format。这里使用实际代码总结下比较少用的2个格式化功能: %[ ] 和 %n
1.从标准输入中读取带有空格的字符串
当然 我们可以使用char *fgets(char *s, int size, FILE *stream);
但是scanf同样可以完成,我们知道scanf的默认以空白符(空格、制表符、回车)分割字符,所以当你输入"hello world"之类的字符串时,得到的只是 hello而已。
你可以使用 %[ ] 来完成, %[ ]可以让我们自定义一个搜索字符集,^ 表示取反的意思 %[^\n]表示不是'\n'都读入,遇到'\n'就停止,也可以在%之后加入数字表示最多读入多少个字符,这样可以控制数组溢出。
#include <stdio.h>
#define MAX_SIZE 128
int
main(void)
{
char buf[MAX_SIZE+1];
scanf("%MAX_SIZE[^\n]",buf);
printf("%s\n",buf);
return 0;
}
2.使用自定义的字符分割
scanf的默认以空白符(空格、制表符、回车)分割字符,那么可不可以自己定义分割的字符呢? 可以,同样使用%[ ]
比如,这样一个字符串"email:christian_chen@126.com" ,我要从这个字符串中提取出user:christian_chen 出来
一起来看代码
#include <stdio.h>
#define MAX_SIZE 128
int
main(void)
{
char email_addr[] = "email:christian_chen@126.com";
char user[MAX_SIZE];
sscanf(email_addr,"%*[^:]:%[^@]",user);
printf("%s\n",user);
}
%*[^:]表示读取不是':'的字符,*表示只读取不存储,也就是忽略了字符串‘:’之前的内容,:%[^@]匹配了一个':'忽略 ,然后读取了不是'@'的字符,也就读取了我们需要的christian_chen
其实stdin.h 提供的scanf非常实用,这里总结一些小技巧
之后总结.....