int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);
************************************scanf************************************
*****************************************************************************
int scanf(const char *format, ...)
scanf(const char *format, ...)
/*功能:从标准输入 stdin 读取格式化输入
* */
/*参数:format -- 这是 C 字符串,包含了以下各项中的一个或多个>:空格字符、非空格字符 和 format 说明符。
* format 说明符形式为 [=%[*][width][modifiers]type=],
* */
/*返回值:如果成功,该函数返回成功匹配和赋值的个数。如果到达文>件末尾或发生读错误,则返回 EOF
* */
#include
int main()
{
char str1[20], str2[30];
printf("请输入用户名:");
scanf("%s", str1);
printf("输入的用户名:%s\n", str1);
return(0);
}
************************************fscanf*********************************************
***************************************************************************************
int fscanf(FILE *stream, const char *format, ...)
fscanf(FILE *stream, const char *format, ...)
/*功能:从流 stream 读取格式化输入
* */
/*参数:
* stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
* format -- 这是 C 字符串,包含了以下各项中的一个或多个:空格
字符、非空格字符 和 format 说明符。format 说明符形式为 [=%[*][width][modifiers]type=],
* */
/*返回值:
* 如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾>或发生读错误,则返回 EOF
* */
/*fgets()与fscanf()的区别:
* 前者遇到空格不结束,遇到换行会结束;后者遇到空格、换行都会>结束*/
#include
char str1[10],str2[10],str3[10];
FILE *fp;
fp = fopen("file.txt","r");
fscanf(fp,"%s %s %s",str1,str2,str3);
printf("%s \n %s \n %s \n",str1,str2,str3);
fclose(fp);
return 0;
}
************************************sscanf*********************************************
***************************************************************************************
int sscanf(const char *str, const char *format, ...)
sscanf(const char *str, const char *format, ...)
/*功能:
*是c语言中从一个字符串中读进与指定格式相符的数据的函数。其是>以固定字符串为源输入*/
/*参数:
*str -- 这是 C 字符串,是函数检索数据的源。
*format -- 这是 C 字符串,包含了以下各项中的一个或多个:空格>字符、非空格字符 和 format 说明符。format 说明符形式为 [=%[*][width][modifiers]type=], */
/*返回值:
* 如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾>或发生读错误,则返回 EOF。例如:sscanf(str,"%d%d%s", &i,&i2, &s); 如果三个变成都读入成功会返回3。 如果只读入了第一个整数到i则会返回1。证明无法从str读入第二个整数*/
首先来了解一下sscanf()函数的常见用法:
#include
#include
#include
int main()
{
int day, year;
char weekday[20], month[20], dtm[100];
char len4[20],speciChara[20],speciChara1[20],contChara[20];
char clipChara[20],speciChara3[20];
strcpy( dtm, "Saturday March 25 1989" );
printf("原来的字符串为:*%s*\n",dtm);
//常见用法
sscanf( dtm, "%s %s %d %d", weekday, month, &day, &year );
printf("常见用法:%s %d, %d = %s\n", month, day, year, weekday );
return(0);
}
接下来,来了解一下sscanf()函数的正则表达式用法:
//在继续讨论之前,我们先来看看百分号表示什么意思,%表示选择,%后面的是条件,比如常见用法中的"%s",s是一个条件,表示任意字符,"%s"的意思是:只要输入的东西是一个字符,就把它拷贝给str。情况1的"%4s"又多了一个条件:只拷贝4个字符。情况2的“%[a-z]”的条件稍微严格一些,输入的东西不但是字符,还得是一个小写字母的字符,所以实验3只拷贝了小写字母"aaa"给len。
(情况1-4给出的 字符串是:strcpy( dtm, "Saturday March 25 1989" );)
情况1:取指定长度字符串,取最大长度为4字节的字符串
sscanf( dtm, "%4s", len4);
printf("取4字节:*%s*\n",len4);//--->>取4字节:*Satu*
情况2:取到指定字符为止的字符串。遇到空格为止的字符串
sscanf( "aaaAAA", "%[a-z]", len);
printf("取指定字符:*%s*\n",len);//--->>取指定字符:*aaa*
sscanf( dtm, "%*[^ ] %[A-Z ]", speciChara);
printf("取到指定字符(空格):*%s*\n",speciChara);//--->>取到指定字符(空格):*M*
sscanf( dtm, "%[^d-z]", speciChara);
printf("取到指定字符(遇到小写字母为止):*%s*\n\n",speciChara);//--->>取到指定字符(遇到小写字母为止):*Sa*
情况3:给定一个字符串,仅保留某些字符
sscanf( dtm, "%*s%s", speciChara3);
printf("仅保留某些字符:*%s*\n\n",speciChara3);//--->>仅保留某些字符:*March*
(情况4给出的 字符串是:sscanf( "iios/12DDWDFF@122", "%*[^/]/%[^@]", clipChara);)
情况4:给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中
printf("此时的字符串为:iios/12DDWDFF@122\n");
sscanf( "iios/12DDWDFF@122", "%*[^/]/%[^@]", clipChara);
printf("取到指定字符(空格):*%s*\n\n",clipChara);//--->>取到指定字符(空格):*12DDWDFF*
(情况5给出的 字符串是:sscanf("Aaturday March 25 1989", "%[1-9a-z]", contChara);)
情况5:取仅包含指定字符集的字符串。取仅包含1-9和小写字母的字符串
printf("此时的字符串为:aturday March 25 1989\n");
sscanf("Aaturday March 25 1989", "%[1-9a-z]", contChara);
printf("仅取包含指定字符集(0-9z-a):%s\n",contChara);
printf("当首字母不能被匹配时候没有结果!!!\n");
情况6:当字符串前后有空格时候,取指定字符的方法。
sscanf(" Aaturday March ", "%*[ \t]%[^ ] %[^ ]", str,str1);
//第一个格式是只读空格 \t,并忽略掉,并且不再匹配空格; 第二个格式是不匹配空格
printf("首尾有空格,正则,只取Aaturday(过滤掉第一个空格/tab):*%s*\n",str);
printf("首尾有空格,正则,只取Aaturday(过滤掉第一个空格/tab):*%s*\n",str1);
sscanf(" Aaturday March ", "%s %s", str,str1);
printf("首尾有空格,只取Aaturday(过滤掉第一个空格/tab):*%s*\n",str);
printf("首尾有空格,只取Aaturday(过滤掉第一个空格/tab):*%s*\n",str1);
sscanf(" Aaturday March ", "%*[ ]%[ ]", str,str1);
printf("首尾有空格,只取March(过滤掉首尾空格):*%s*\n",str1);
情况7:分割字符串
char sztime1[16] = "", sztime2[16] = "";
sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);
printf("%s %s\n",sztime1,sztime2); //--->>2006:03:18 2006:04:18
char sztime21[16] = "", sztime22[16] = "";
sscanf("2006:03:18-2006:04:18", "%[0-9,:] - %[0-9,:]", sztime21, sztime22);
printf("%s %s\n",sztime21,sztime22); //--->>2006:03:18 2006:04:18
最后总结一下:
注意1、 附加参数 -- 这个函数接受一系列的指针作为附加参数,每一个指针都指向一个对象,对象类型由 format 字符串中相应的 % 标签指定,参数与 % 标签的顺序相同。针对检索数据的 format 字符串中的每个 format 说明符,应指定一个附加参数。如果您想要把 sscanf 操作的结果存储在一个普通的变量中,您应该在标识符前放置引用运算符(&),例如:
int n;
sscanf (str,"%d",&n);
int n;
sscanf (str,"%d",&n);
注意2、sscanf的功能很类似于正则表达式, 但却没有正则表达式强大,所以如果对于比较复杂的字符串处理,建议使用正则表达式.
《 正则表达式的基本用法——正则表达式的全部符号表示》
“*” 0次或者多次
“+” 1次或者多次
“?” 0次或者1次
“{n}” 匹配n次,n为整数
“{n,m}” 匹配从n到m之间的某个数的次数;n和m都是整数;
“{n,}” 匹配n到无穷次之间任意次数;
“{,m}” 匹配0到m之间任意次数;
数量限定符号放到匹配格式的后面,例如:电话号码:024-84820482,02484820482(假设前面3或者4位,后面7或者8位,并且中间的减号可有可无),都是符合规定的,那么可以用如下格式来匹配:[0-9]{3,4} \-? [0-9]{7,8};注意:“\”为转义字符,因为“-”在正则表达式用有代表一个范围的意义,例如:前面所说的[0-9],所以它需要转义字符“\”进行转义才可使用;
4、^为否符号,表示不想匹配的符号,例如:[^z][a-z]+可以匹配所有除"z"开头的以外的所有字
如果^放到[]的外边则表示以[]开头的字符串;^[az][a-z]+表示a或者z开头的长度大于等于2的英文字符串;
5、“|”或运算符,例如:a[n|bc|cb]c可以匹配“abcc”,“anc”,“acbc”;
6、“$”以它前面的字符结尾的;例如:ab+$就可以被“abb”,“ab”匹配;
7、一些简单表示方法:\d表示[0-9];\D表示[^0-9];\w表示[A-Z0-9];\W表示[^A-Z0-9];\s表示[\t\n\r\f],就是空格字符包括tab,空格等等;\S表示[^\t\n\r\f],就是非空格字符;
完整代码如下:
#include
#include
#include
int main()
{
int day, year;
char weekday[20], month[20], dtm[100];
char len[10],len4[20],speciChara[20],speciChara1[20],contChara[20];
char clipChara[20],speciChara3[20];
char str[30],str1[30],str2[30];
printf("************************************************\n");
printf("字符串首位没有空格 或者 tab\n");
printf("************************************************\n");
printf("字符串首位没有空格 tab\n");
strcpy( dtm, "Saturday March 25 1989" );
printf("原来的字符串为:*%s*\n",dtm);
//常见用法
sscanf( dtm, "%s %s %d %d", weekday, month, &day, &year );
printf("常见用法:%s %d, %d = %s\n", month, day, year, weekday );
//取指定长度字符串,取最大长度为4字节的字符串
sscanf( dtm, "%4s", len4);
printf("取4字节:*%s*\n",len4);
//取到指定字符为止的字符串。遇到空格为止的字符串
sscanf( "aaaAAA", "%[a-z]", len);
printf("取指定字符:*%s*\n",len);
sscanf( dtm, "%*[^ ] %[A-Z ]", speciChara);
printf("取到指定字符(空格):*%s*\n",speciChara);
sscanf( dtm, "%[^d-z]", speciChara);
printf("取到指定字符(遇到小写字母为止):*%s*\n\n",speciChara);
//给定一个字符串,仅保留某些字符
sscanf( dtm, "%*s%s", speciChara3);
printf("仅保留某些字符:*%s*\n\n",speciChara3);
printf("此时的字符串为:iios/12DDWDFF@122\n");
sscanf( "iios/12DDWDFF@122", "%*[^/]/%[^@]", clipChara);
printf("取到指定字符(空格):*%s*\n\n",clipChara);
//取仅包含指定字符集的字符串。取仅包含1-9和小写字母的字符串
printf("此时的字符串为:aturday March 25 1989\n");
sscanf("Aaturday March 25 1989", "%[1-9a-z]", contChara);
printf("仅取包含指定字符集(0-9z-a):%s\n",contChara);
printf("当首字母不能被匹配时候没有结果!!!\n\n");
//当字符串首尾都有空格时候,取指定字符的方法
sscanf(" Aaturday March ", "%*[ \t]%[^ ] %[^ ]", str,str1);
printf("首尾有空格,正则,只取Aaturday(过滤掉第一个空格/tab):*%s*\n",str);
printf("首尾有空格,正则,只取Aaturday(过滤掉第一个空格/tab):*%s*\n",str1);
sscanf(" Aaturday March ", "%s %s", str,str1);
printf("首尾有空格,只取Aaturday(过滤掉第一个空格/tab):*%s*\n",str);
printf("首尾有空格,只取Aaturday(过滤掉第一个空格/tab):*%s*\n",str1);
/***原先是如下方式写的,经查证是错误的
*sscanf(" Aaturday March ", "%*[ ]%[ ]", str,str1); */
sscanf(" Aaturday March ", "%*[ ]%s%s%*[ ]", str,str1); //词句是正确的
/* 上一句等价值于*/
//sscanf(" Aaturday March ", "%*[ ]%s%s", str,str1); //"%*[ ]"都没有
//sscanf(" Aaturday March ", "%*[ ]%s%s%", str,str1);//只有"%”
//sscanf(" Aaturday March ", "%*[ ]%s%s*", str,str1);//只有"*"
//sscanf(" Aaturday March ", "%*[ ]%s%s[ ]", str,str1);//只有"[ ]"
printf("首尾有空格,只取March(过滤掉首尾空格):*%s*\n",str1);
//分割字符串
char sztime1[16] = "", sztime2[16] = "";
sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);
printf("%s %s\n",sztime1,sztime2);
char sztime21[16] = "", sztime22[16] = "";
sscanf("2006:03:18-2006:04:18", "%[0-9,:] - %[0-9,:]", sztime21, sztime22);
printf("%s %s\n",sztime21,sztime22);
return(0);
}
参考链接:https://blog.csdn.net/weixin_42167759/article/details/80403578