sscanf函数—(sprintf的反)
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
先上例子:
#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>
?定義函數(shù) int sscanf (const char *str,const char * format,........);
函數(shù)說明?
?sscanf()會(huì)將參數(shù)str的字符串根據(jù)參數(shù)format字符串來轉(zhuǎn)換并格式化數(shù)據(jù)。格式轉(zhuǎn)換形式請(qǐng)參考scanf()。轉(zhuǎn)換后的結(jié)果存于對(duì)應(yīng)的參數(shù)內(nèi)。
返回值 成功則返回參數(shù)數(shù)目,失敗則返回-1,錯(cuò)誤原因存于errno中。 返回0表示失敗 ? ?否則,表示正確格式化數(shù)據(jù)的個(gè)數(shù) ? ?例如:sscanf(str,"%d%d%s", &i,&i2, &s); ? ?如果三個(gè)變成都讀入成功會(huì)返回3。 ? ?如果只讀入了第一個(gè)整數(shù)到i則會(huì)返回1。證明無法從str讀入第二個(gè)整數(shù)。
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);? }執(zhí)行 10 27 aaaaa
大家都知道sscanf是一個(gè)很好用的函數(shù),利用它可以從字符串中取出整數(shù)、浮點(diǎn)數(shù)和字符串等等。它的使用方法簡單,特別對(duì)于整數(shù)和浮點(diǎn)數(shù)來說。但新手可能并不知道處理字符串時(shí)的一些高級(jí)用法,這里做個(gè)簡要說明吧。
1. 常見用法
char?str[512]={0}; sscanf("123456","%s",str); printf("str=%s",str);2. 取指定長度的字符串。如在下例中,取最大長度為4字節(jié)的字符串。
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地址轉(zhuǎn)換為四個(gè)整數(shù)
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的使用,以解析時(shí)間字符串為例,將字符串“2009-01-02_11:12:13”解析為整型年月日時(shí)分秒
//定義char?cc;tm?tm_temp={0};string?stime("2009-01-02_11:12:13");//(1) 必須嚴(yán)格按照分隔符形式匹配填寫,若遇到不匹配項(xiàng)則終止解析
?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) 可以不按照分割符號(hào)形式填寫,字符數(shù)必須一致,例如可以正確解析“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) 可以不按照分割符號(hào)形式填寫,字符數(shù)必須一致,同上,%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) 可以不按照分割符形式和數(shù)量填寫,類型必須一致,例如可以正確解析“2009/01/02___11:12:13”
//這里使用了sscanf的正則表達(dá)式,與通用的正則表示類似但不完全相同,%*c表示忽略連續(xù)多個(gè)字符
?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);轉(zhuǎn)載于:https://my.oschina.net/crooner/blog/221952
總結(jié)
以上是生活随笔為你收集整理的sscanf函数—(sprintf的反)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS下软件的安装
- 下一篇: eclipse下3种安装插件的方式及缺点