C語言中的sscanf()函數(shù)使用
一、描述
sscanf通常被用來解析并轉(zhuǎn)換字符串,其格式定義靈活多變,可以實(shí)現(xiàn)很強(qiáng)大的字符串解析功能。
sscanf的原型
#include <stdio.h> int sscanf(const char *str, const char *format, ...);
str:待解析的字符串;
format:字符串格式描述;
其后是一序列數(shù)目不定的指針參數(shù),存儲(chǔ)解析后的數(shù)據(jù).
二、示例用法
1. sscanf的基本用法
整形數(shù)轉(zhuǎn)換
int year, month, day; int converted = sscanf("20191103", "%04d%02d%02d", &year, &month, &day); printf("converted=%d, year=%d, month=%d, day=%d/n", converted, year, month, day);
輸出結(jié)果:
converted=3, year=2019, month=11, day=03
"%04d%02d%02d"是用來解析字符串的格式,%表示格式轉(zhuǎn)換的開始,d表示轉(zhuǎn)換為一個(gè)整數(shù),04作為d的修飾,表示這是一個(gè)長度為4位的整數(shù),不足4位時(shí)以0補(bǔ)齊。
例子返回結(jié)果等于3,表示有3個(gè)數(shù)據(jù)成功轉(zhuǎn)換,轉(zhuǎn)換成功數(shù)目同時(shí)取決于被解析的字符串以及其轉(zhuǎn)換格式,如果我們把例子中的格式改為"%04d%02d",那么sscanf將只返回2,day的數(shù)值不會(huì)被sscanf更改。
浮點(diǎn)數(shù)轉(zhuǎn)換
double longitude, latitude; int converted = sscanf("113.123456789 31.123456789", "%lf %lf", &longitude, &latitude); printf("converted=%d, longitude=%.9lf, latitude=%lf/n", converted, longitude, latitude);
輸出結(jié)果:
converted=2, longitude=113.123456789, latitude=31.123457
sscanf的格式字符串中,f表示這是一個(gè)浮點(diǎn)數(shù),其修飾詞l表示這是一個(gè)double的浮點(diǎn)數(shù)。
2. sscanf的高級用法
數(shù)字+字符串
char str[32] = ""; sscanf("123456abcdedf", "%31[0-9]", str); printf("str=%s/n", str);
輸出結(jié)果:
str=123456
上面的格式中,[0-9]表示這是一個(gè)僅包含0-9這幾個(gè)字符的字符串,前面使用數(shù)字31修飾詞表示這個(gè)字符串緩沖區(qū)的最大長度(這也是sscanf最為人詬病的地方,很容易出現(xiàn)緩沖區(qū)溢出錯(cuò)誤,實(shí)際上sscanf是可以避免出現(xiàn)緩沖區(qū)溢出的,只要在書寫任何字符串解析的格式時(shí),注意加上其緩沖區(qū)尺寸的限制)。
char str[32] = ""; sscanf("123456abcdedf", "%31[0-9a-z]", str); printf("str=%s/n", str);
輸出結(jié)果:
str=123456abcdedf
在格式[]中增加了a-z的描述。
使用^示例:
char str[32] = ""; sscanf("123456abcdedf", "%31[^a-z]", str); printf("str=%s/n", str);
輸出結(jié)果:
str=123456
在[]中增加表示相反的意思,上面的[a-z]表示一個(gè)不包含任何a-z之間的字符串。
使用*的例子:
char str[32] = ""; int ret = sscanf("123456abcdedf", "%*[0-9]%31[a-z]", str); printf("ret=%d, str=%s/n",ret, str);
輸出結(jié)果:
ret=1, str=abcdedf
加上*修飾表示一個(gè)被忽略的數(shù)據(jù),同時(shí)也不需要為它準(zhǔn)備空間存放解析結(jié)果。如上面的例子中,我們就只使用了str一個(gè)參數(shù)存放%31[a-z]的解析結(jié)果,而sscanf也只返回1,表示只解析了一個(gè)數(shù)據(jù)。
掌握了[], ^, *如何使用后,我們會(huì)發(fā)現(xiàn)sscanf原來是一個(gè)如此強(qiáng)大的工具,很多我們原先認(rèn)為必須使用正則表達(dá)式的地方,很可能使用sscanf就可以實(shí)現(xiàn)。
舉例:
1. 取指定長度的字符串
#include<stdio.h> #include<string.h> int main() { char str[100]; sscanf("12345","%4s",str); printf("%s\n",str); return 0; }
2. 格式化時(shí)間
#include<stdio.h> #include<string.h> int main() { int year, month, day, hour, minute, second; sscanf("2013/02/13 14:55:34","%d/%d/%d %d:%d:%d",&year, &month, &day, &hour, &minute, &second); printf("time=%d-%d-%d %d:%d:%d\n", year, month, day, hour, minute, second); return 0; }
3. 讀入字符串
#include<stdio.h> #include<string.h> int main() { ?? ?char str[100]; ?? ?sscanf("12345","%s",str); ?? ?printf("%s\n",str); ?? ?return 0; } #include<stdio.h> #include<string.h> int main() { ??? ?char str1[100], str2[100], str3[100]; ? ?? ?gets(str1); ? ?? ?sscanf(str1,"%s%s",str2,str3); ? ?? ?printf("%s %s\n",str2,str3); ?? ?return 0; }
4. %*d和%*s加了(*)表示跳過此數(shù)據(jù)不讀入(也就是不把此數(shù)據(jù)讀入?yún)?shù)中)
#include<stdio.h> #include<string.h> int main() { char str[100]; sscanf("1234abcd","%*d%s",str); printf("%s\n",str); return 0; }
5. 取到指定字符為止的字符串。如例子所示,遇到‘+’為止的字符串。
#include<stdio.h> #include<string.h> int main() { char str[100]; sscanf("1234+abc","%[^+]",str); printf("%s\n",str); return 0; }
遇到空格為止的字符串
#include<stdio.h> #include<string.h> int main() { char str[100]; sscanf("1234+abc1234","%[^]",str); printf("str=%s\n",str); return 0; }
6. 取到指定字符集為止的字符串。如遇到小寫字母為止的字符串。
#include<stdio.h> #include<string.h> int main() { char str[100]; sscanf("1234+abc1234","%[^a-z]",str); printf("%s\n",str); return 0; }
7. 取僅包含指定字符集的字符串。(取僅包含數(shù)字和小寫字母的字符串,是取得連續(xù)的字符串)。
#include<stdio.h> #include<string.h> int main() { char str[100]; sscanf("123456abcdefBFRGTY7890","%[1-9a-z]",str); printf("%s\n",str); return 0; }
到此這篇關(guān)于C語言中的sscanf()函數(shù)使用的文章就介紹到這了,更多相關(guān)C語言 sscanf()內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt中QTextEdit和QPlainTextEdit控件的實(shí)現(xiàn)
本文主要介紹了Qt中QTextEdit和QPlainTextEdit控件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04C語言結(jié)構(gòu)體數(shù)組同時(shí)賦值的另類用法
今天小編就為大家分享一篇關(guān)于C語言結(jié)構(gòu)體數(shù)組同時(shí)賦值的另類用法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12c語言數(shù)據(jù)結(jié)構(gòu)與算法之順序表的定義實(shí)現(xiàn)詳解
這篇文章主要介紹了c語言數(shù)據(jù)結(jié)構(gòu)與算法之順序表的定義實(shí)現(xiàn)詳解,用順序存儲(chǔ)的方式實(shí)現(xiàn)線性表順序存儲(chǔ),把邏輯上相鄰的元素存儲(chǔ)在物理位置上也相鄰的存儲(chǔ)單元中,元素之間的關(guān)系由存儲(chǔ)單元的鄰接關(guān)系來體現(xiàn),需要的朋友可以參考下2023-08-08C++高并發(fā)內(nèi)存池的實(shí)現(xiàn)
本文主要介紹了C++高并發(fā)內(nèi)存池的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07C++實(shí)現(xiàn)LeetCode(31.下一個(gè)排列)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(31.下一個(gè)排列),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07