sscanf函数—(sprintf的反)
2019獨角獸企業重金招聘Python工程師標準>>>
先上例子:
#include?<stdio.h> using?namespace?std; int?main() {const?char*?s?=?"123456";char?buf[20];unsigned?int?aa1,?aa2,?aa3;//注意不能用unsigned?charsscanf(?s,?"%02x%02x%02x",?&aa1,?&aa2,?&aa3?);printf(?"%02x,%02x,%02x\n",?aa1,?aa2,?aa3?);return?0; }頭文件
#include<stdio.h>
?定義函數 int sscanf (const char *str,const char * format,........);
函數說明?
?sscanf()會將參數str的字符串根據參數format字符串來轉換并格式化數據。格式轉換形式請參考scanf()。轉換后的結果存于對應的參數內。
返回值 成功則返回參數數目,失敗則返回-1,錯誤原因存于errno中。 返回0表示失敗 ? ?否則,表示正確格式化數據的個數 ? ?例如:sscanf(str,"%d%d%s", &i,&i2, &s); ? ?如果三個變成都讀入成功會返回3。 ? ?如果只讀入了第一個整數到i則會返回1。證明無法從str讀入第二個整數。
void?main()? {?int?i;?unsigned?int?j;?char?input[?]=”10?0x1b?aaaaaaaa?bbbbbbbb”;?char?s[5];?sscanf(input,”%d?%x?%5[a-z]?%*s?%f”,&i,&j,s,s);?printf(“%d?%d?%s?”,i,j,s);? }執行 10 27 aaaaa
大家都知道sscanf是一個很好用的函數,利用它可以從字符串中取出整數、浮點數和字符串等等。它的使用方法簡單,特別對于整數和浮點數來說。但新手可能并不知道處理字符串時的一些高級用法,這里做個簡要說明吧。
1. 常見用法
char?str[512]={0}; sscanf("123456","%s",str); printf("str=%s",str);2. 取指定長度的字符串。如在下例中,取最大長度為4字節的字符串。
char?str[512]={0}; sscanf("123456","%4s",str); printf("str=%s",str);3. 取到指定字符為止的字符串。如在下例中,取遇到空格為止字符串。
char?str[512]={0}; sscanf("123456abcdedf","%[^]",str); printf("str=%s",str);4. 取僅包含指定字符集的字符串。如在下例中,取僅包含1到9和小寫字母的字符串。
char?str[512]={0}; sscanf("123456abcdedfBCDEF","%[1-9a-z]",str); printf("str=%s",str);5. 取到指定字符集為止的字符串。如在下例中,取遇到大寫字母為止的字符串。
char?str[1024]={0}; sscanf("123456abcdedfBCDEF",?"%[^A-Z]",?str); printf("str=%s\n",?str);6. 可以用如下代碼將字符串形式的ip地址轉換為四個整數
char?*?inputIp="192.168.199.100"; int?ip[4]; sscanf(inputIp,?"%d.%d.%d.%d",?&ip[0],?&ip[1],&ip[2],&ip[3]); printf("%d.%d.%d.%d\n",ip[0],?ip[1],ip[2],ip[3]);7. sscanf的使用,以解析時間字符串為例,將字符串“2009-01-02_11:12:13”解析為整型年月日時分秒
//定義char?cc;tm?tm_temp={0};string?stime("2009-01-02_11:12:13");//(1) 必須嚴格按照分隔符形式匹配填寫,若遇到不匹配項則終止解析
?sscanf(stime.c_str(),?"%4d-%2d-%2d_%2d:%2d:%2d",&tm_temp.tm_year,?&tm_temp.tm_mon,?&tm_temp.tm_mday,?&tm_temp.tm_hour,?&tm_temp.tm_min,?&tm_temp.tm_sec);//(2) 可以不按照分割符號形式填寫,字符數必須一致,例如可以正確解析“2009/01/02_11:12:13”
?sscanf(stime.c_str(),?"%4d%c%2d%c%2d%c%2d%c%2d%c%2d",&tm_temp.tm_year,?&cc,&tm_temp.tm_mon,?&cc,&tm_temp.tm_mday,?&cc,&tm_temp.tm_hour,?&cc,&tm_temp.tm_min,?&cc,&tm_temp.tm_sec);//(3) 可以不按照分割符號形式填寫,字符數必須一致,同上,%1s可以等同于%c
?sscanf(stime.c_str(),?"%4d%1s%2d%1s%2d%1s%2d%1s%2d%1s%2d",&tm_temp.tm_year,?&cc,&tm_temp.tm_mon,?&cc,&tm_temp.tm_mday,?&cc,&tm_temp.tm_hour,?&cc,&tm_temp.tm_min,?&cc,&tm_temp.tm_sec);//(4) 可以不按照分割符形式和數量填寫,類型必須一致,例如可以正確解析“2009/01/02___11:12:13”
//這里使用了sscanf的正則表達式,與通用的正則表示類似但不完全相同,%*c表示忽略連續多個字符
?sscanf(stime.c_str(),?"%4d%*c%2d%*c%2d%*c%2d%*c%2d%*c%2d",&tm_temp.tm_year,?&tm_temp.tm_mon,?&tm_temp.tm_mday,?&tm_temp.tm_hour,?&tm_temp.tm_min,?&tm_temp.tm_sec);轉載于:https://my.oschina.net/crooner/blog/221952
總結
以上是生活随笔為你收集整理的sscanf函数—(sprintf的反)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS下软件的安装
- 下一篇: eclipse下3种安装插件的方式及缺点