sscanf和sprintf高级应用

sscanf
 
  sscanf() - 从一个字符串中读进与指定格式相符的数据.
 
  函数原型:
 
  int sscanf( const char *, const char *, ...);
 
  int sscanf(const char *buffer,const char *format,[argument ]...);
 
  buffer 存储的数据
 
  format 格式控制字符串
 
  argument 选择性设定字符串
 
  sscanf会从buffer里读进数据,依照argument的设定将数据写回。
 

头文件:

   #include<stdio.h>
 

返回值:

  成功则返回参数数目,失败则返回0,错误原因存于errno中。
 

说明:

   sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。  
 
 第一个参数可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}
 
   注:
 
  1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)
 
  2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。
 
  3、width表示读取宽度。
 
  4、{h | l | I64 | L}:参数的size,通常h表示单 字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。
 
  5、type :这就很多了,就是%s,%d之类。
 
  6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值
 
  失败返回0 ,否则返回格式化的参数个数
 

支持集合操作:

  %[a-z] 表示匹配a到z中任意 字符,贪婪性(尽可能多的匹配)
 
  %[aB'] 匹配a、B、'中一员,贪婪性
 
  %[^a] 匹配非a的任意字符,并且停止读入,贪婪性
 
  具体代码如下:
 
[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <stdlib.h>  
  4. int main()  
  5. {  
  6.     char str[512]="";  
  7.   
  8.     //一、格式化输出字符串,相当于strcpy  
  9.     sscanf("123456""%s", str);  
  10.     puts(str);  
  11.     /*output 123456*/  
  12.       
  13.       
  14.     //二、取指定长度的字符串  
  15.     strcpy(str, "");  
  16.     sscanf("12345678""%4s", str);  
  17.     puts(str);  
  18.     /*output 1234*/  
  19.       
  20.       
  21.     //三、取到指定字符串为止。  
  22.     sscanf("123456789 abcdfe""%[^ ]", str);  
  23.     puts(str);  
  24.     /*output 123456789*/  
  25.       
  26.       
  27.     //四、取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。  
  28.     strcpy(str, "");  
  29.     sscanf("89hkDFCCQQQQ""%[1-9a-z]", str);   //123SFDAF89DFCC9QQQQsssssfdfa  
  30.     puts(str);  
  31.     /*output 89hk*/  
  32.   
  33.       
  34.     //五、取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。  
  35.     strcpy(str, "");  
  36.     sscanf("123456789fdsafdsaDDDDDD""%[^A-Z]", str);  
  37.     puts(str);  
  38.     /*output 123456789fdsafdsa*/  
  39.       
  40.       
  41.     //六、取出下面字符串中数字2位为一组取出  
  42.      char a1[3], a2[3], a3[3]; int i1,i2;  
  43.     sscanf("12:34:56-7890""%2s:%2s:%2s-%2d%2d", a1, a2, a3, &i1, &i2);  
  44.     printf("--%s---%s----%s----%d----%d---\n", a1, a2, a3, i1, i2);  
  45.     /*output 12 34 56 78 90*/  
  46.   
  47.       
  48.     //七、以','为分割取出下面字符串  
  49.     char a4[10], a5[10], a6[10], a7[10];   
  50.     sscanf("first,25.5,second,15""%5s,%4s,%6s,%2s", a4, a5, a6, a7);     /*method one*/  
  51.     sscanf("first,25.5,second,15""%[^,],%[^,],%[^,],%s", a4, a5, a6, a7);/*method two*/  
  52.     printf("--%s---%lf----%s----%d--\n", a4, atof(a5), a6, atoi(a7));  
  53.     /*output first 25.500000 seond 15*/  
  54.       
  55.       
  56.     //八、给定一个字符串iios/12DDWDFF@122,获取 '/' 和 '@' 之间的字符串,  
  57.     //先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中     
  58.     strcpy(str, "");  
  59.     sscanf("iios/12DDWDFF@122""%*[^/]/%[^@]", str);  
  60.     puts(str);  
  61.     /*ouput: 12DDWDFF*/  
  62.       
  63.       
  64.     //九、给定一个字符串"hello, world",仅保留world。  
  65.     //(注意:","之后有一空格,%s遇空格停止,加*则是忽略第一个读到的字符串)  
  66.     strcpy(str, "");  
  67.     sscanf("hello, world""%*s%s", str);  
  68.     puts(str);  
  69.     /*output: wrold*/  
  70.       
  71.       
  72.     //十、处理时间分割函数  
  73.     char a8[15], a9[15];  
  74.     //sscanf("2006:03:18 - 2006:04:18", "%s - %s", a8, a9);  
  75.     //sscanf("2006:03:18-2006:04:18", "%s-%s", a8, a9);     //error  
  76.     sscanf("2006:03:18-2006:04:18""%[^-]-%s", a8, a9);    //method one  
  77.     sscanf("2006:03:18-2006:04:18""%10s-%10s", a8, a9);   //method two  
  78.     printf("#######%s#########%s######\n", a8, a9);  
  79.     /*output: 2006:03:18 2006:04:18*/  
  80.   
  81.      //十一、指定要跳过的字符串  
  82.      char a10[15], a11[15];   
  83.      sscanf("iosVSandroid""%[a-z]VS%[a-z]", a10, a11);  
  84.      printf("###%s######%s###\n", a10, a11);  
  85.      /*output: ios android*/  
  86.    
  87.    
  88.      //十二、提取邮箱地址  
  89.      char a12[10], a13[10], a14[10], a15[10];  
  90.      sscanf("Email:beijing@sina.com.cn""%[^:]:%[^@]@%[^.].%s", a12, a13, a14, a15);  
  91.      printf("#####%s#######%s#######%s######%s####\n", a12, a13, a14, a15);  
  92.      /*output: Email  beijing  sina   com.cn*/  
  93.      return 0;  
  94. }   
 

sprintf

 

c语言在字符串处理中本来就很繁琐,但字符串处理是编写代码最常遇到的问题,今天说的sprintf是printf的加强版。用好了它

能在字符串处理中做到事半功倍的效果,具体看代码:

 

函数简介:

字串格式化命令,主要功能是把格式化的数据写入某个字符串中。sprintf 是个变参函数,使用时经常出问题,而且只要出问题通常就是能导致程序崩溃的内存访问错误,但好在由sprintf 误用导致的问题虽然严重,却很容易找出,无非就是那么几种情况,通常用眼睛再把出错的代码多看几眼就看出来了。

函数功能:

  把格式化的数据写入某个字符串缓冲区。

头文件:

  stdio.h

函数原型:

  int sprintf( char *buffer, const char *format, [ argument] … );

参数列表:

  buffer:char型指针,指向将要写入的字符串的缓冲区。

  format:char型指针,指向的内存里面存放的将要格式字符串。

  [argument]...:可选参数,可以是任何类型的数据。

  返回值:字符串长度(strlen)

相关函数:

  int sprintf_s(char *buffer,size_t sizeOfBuffer,const char *format, [argument] ... );

  int _sprintf_s_l(char *buffer,size_t sizeOfBuffer,const char *format,locale_t locale ,[argument] ... );

  int swprintf_s(wchar_t *buffer,size_t sizeOfBuffer,const wchar_t *format ,[argument]...);

  int _swprintf_s_l(wchar_t *buffer,size_t sizeOfBuffer,const wchar_t *format,locale_t locale ,[argument]…);

  template <size_t size>

  int sprintf_s(char (&buffer)[size],const char *format, [argument] ... ); //仅存在于C++

  template <size_t size>

        int swprintf_s(wchar_t (&buffer)[size],const wchar_t *format ,[argument]...); //仅存在于C++

 

参数说明及应用举例

  sprintf格式的规格如下所示。[]中的部分是可选的。

  %[指定参数][标识符][宽度][.精度]指示符

  若想输出`%'本身时, 请这样`%%'处理。

  1. 处理字符方向。负号时表示从后向前处理。

  2. 填空字元。 0 的话表示空格填 0;空格是内定值,表示空格就放着。

  3. 字符总宽度。为最小宽度。

  4. 精确度。指在小数点后的浮点数位数。

  =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

转换字符

  =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

  %% 印出百分比符号,不转换。

  %c 整数转成对应的 ASCII 字元。

  %d 整数转成十进位。

  %f 倍精确度数字转成浮点数。

  %o 整数转成八进位。

  %s 整数转成字符串。

  %x 整数转成小写十六进位。

  %X 整数转成大写十六进位。

 

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <string.h>  
  3. int main()  
  4. {  
  5.     char buf[100] = "";  
  6.   
  7.     //一、整型格式化为字符串(大多数情况下可以由itoa代替)  
  8.     sprintf(buf, "%d", 123);  
  9.     puts(buf);  
  10.     /*output: 123*/  
  11.       
  12.     //指定宽度,不足的左边补空格  
  13.     strcpy(buf, "");  
  14.     sprintf(buf,"%8d%8d", 12,78995);  
  15.     puts(buf);  
  16.     /*output:      12   78995("12"前面有6个空格,"78995"前边3个空格)*/  
  17.       
  18.     //十进制左边对齐输出  
  19.     strcpy(buf, "");  
  20.     sprintf(buf, "%-8d%-8d", 456, 84569);  
  21.     puts(buf);  
  22.     /*output:456     84569(中间5个空格)*/  
  23.       
  24.     //按照16进制打印  
  25.     strcpy(buf, "");  
  26.     sprintf(buf, "%8x", 4578);  
  27.     puts(buf);  
  28.     /*output: 12e2*/  
  29.       
  30.       
  31.     //按照16进制左边补零输出  
  32.     strcpy(buf, "");  
  33.     sprintf(buf, "%08X", 4569);  
  34.     puts(buf);  
  35.     /*output: 000011D9*/  
  36.       
  37.     //左边补零方式打印一个短整型  
  38.     strcpy(buf, "");  
  39.     sprintf(buf, "%04X", (unsigned short)2);  
  40.     puts(buf);  
  41.     /*output: 0002*/  
  42.       
  43.     //二、浮点型打印成字符串  
  44.     strcpy(buf, "");  
  45.     sprintf(buf, "%f", 3.1415926);  
  46.     puts(buf);  
  47.     /*output: 3.141593 四舍五入*/  
  48.       
  49.     //控制宽度和小数点位数输出  
  50.     strcpy(buf, "");  
  51.     sprintf(buf, "%10.3f", 3.1415926);  
  52.     puts(buf);  
  53.     /*output:     3.142(前面5个空格)*/  
  54.       
  55.     //连接字符串  
  56.     strcpy(buf, "");  
  57.     char buf1[]="I"char buf2[]="you!";  
  58.     sprintf(buf, "%s love %s", buf1, buf2);  
  59.     puts(buf);  
  60.     /*output: I love you!*/  
  61.       
  62.     //连接2个字符串没有以'\0'结束  
  63.     //sprintf 采用”*”来占用一个本来需要一个指定宽度或精度的常数数字的位置  
  64.     strcpy(buf, "");  
  65.     char a1[] = {'a''b''c''d''e'};  
  66.     char a2[] = {'f''g''h''j'};  
  67.     //sprintf(buf, "%s%s", a1, a2);                 //error  
  68.     //sprintf(buf, "%5s%4s", a1, a2);               //error  
  69.     //sprintf(buf, "%.5s%.4s", a1, a2);             //method one  
  70.     //sprintf(buf, "%.*s%.*s", 5, a1, 4, a2);       //method two  
  71.     sprintf(buf, "%.*s%.*s"sizeof(a1), a1, sizeof(a2), a2); //method three  
  72.     puts(buf);  
  73.       
  74.     return 0;  
  75. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值