函数 —— scanf() fscanf() sscanf() (分析sscanf正则表达式的用法)

       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#includeint main(){  

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);

函数 —— scanf() fscanf() sscanf() (分析sscanf正则表达式的用法)_第1张图片

  情况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);
}

函数 —— scanf() fscanf() sscanf() (分析sscanf正则表达式的用法)_第2张图片

 

参考链接:https://blog.csdn.net/weixin_42167759/article/details/80403578

你可能感兴趣的:(C,语言,C++,函数,对字符串的操作)