1 scanf中的正则表达式:
1.1 定制扫描集
%[abc]、%[a-z]、%[^abc]、%[^a-z]
[ ]内是匹配的字符,^表示求反集,比isdigit()、isalpha()更灵活:
读取含有空格的字符串
#include <stdio.h>
int main()
{
char str[128];
scanf( "%[^\n]", str ); //fgets(str,128,stdin);//gets无边界检查,危险函数
printf( "%s\n", str );
return 0;
}
2 fgets()
fgets(data, MAXSIZE)
如果输入的字符串小于MAXSIZE,会将'\n'也取出来,实际存储的有效字符为MAXSIZE-2
#include<stdio.h>
#include<string.h>
#define DATASIZE 10
int main()
{
char data[DATASIZE]={};
char *ret=NULL;
ret = fgets(data, DATASIZE, stdin);
if (ret)
{
char *get_enter;
get_enter = strchr(data, '\n');
if (get_enter) //get_enter不为NULL
*get_enter = '\0';
else
while(getchar() != '\n');
}
}
2 sscanf
与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,sscanf以固定字符串为输入源。
int sscanf(const char *str, const char *format, ...);
格式:
{%[*] [width] [{h | l | I64 | L}] type}
[*]代表该%段不向结果缓冲区输出(用正则术语来说就是:只匹配不捕获)
#include<stdio.h>
int main()
{
double t;
sscanf("temperature: 32.6℃", "temperature: %lf", &t);
printf("温度为:%lf\n", t);
return 0;
}
//输出
温度为:32.600000
char res1[5];
char res2[10];
sscanf("Abcd123--++?789efGH", "%5[a-zA-Z]%*[^a-zA-Z]%10[a-zA-Z]", res1, res2);
- %5[a-zA-Z],其中5代表:如果匹配成功的字符数<=5,那就输出实际的字符数;如果匹配成功的字符数>5,那么最多向结果缓冲区输出匹配出的5个字符,第二个%匹配段将从第6个字符开始检查。
- %*[^a-zA-Z],其中*号代表匹配出的结果不输出,[^a-zA-Z]代表匹配不含a-zA-Z的最长字符串
参考文档:
https://blog.csdn.net/qq_31073871/article/details/90445284