C說話中的sscanf()函數應用詳解。本站提示廣大學習愛好者:(C說話中的sscanf()函數應用詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話中的sscanf()函數應用詳解正文
sscanf() - 從一個字符串中讀進與指定格局符合的數據.
函數原型:
Int sscanf( string str, string fmt, mixed var1, mixed var2 ... ); int scanf( const char *format [,argument]... );
解釋:
sscanf與scanf相似,都是用於輸出的,只是後者以屏幕(stdin)為輸出源,前者以固定字符串為輸出源。
個中的format可所以一個或多個 {%[*] [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 表現知足該前提的被過濾失落,不會向目的參數中寫入值
支撐聚集操作:
%[a-z] 表現婚配a到z中隨意率性字符,貪心性(盡量多的婚配)
%[aB'] 婚配a、B、'中一員,貪心性
%[^a] 婚配非a的隨意率性字符,貪心性
format格局
{%[*] [width][{h | l | l64 | L}]type | ' ' | t' | '\n' | 非%符號}
注:
*可用於格局中,(即%*d和%*s)加了星號(*)表現跳過此數據不讀入。(也就是不把數據讀入到參數中)
width表現讀取寬度
{h | l | l64 | L}:參數size,平日h表現單字節size,l表現2字節size,L表現4字節size,l64表現8字節size
type參數類型,例如%s,%d
支撐正則表達式,例如%[a-z]婚配a到z中隨意率性字符(ps:正則表達式這個假期我會寫一篇博客記載)
參考用例
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int result; char str[100]; char buf1[255], buf2[255], buf3[255], buf4[255]; //根本用法 memset(str, 0, sizeof(str)); strcpy(str, "i love china!"); result = sscanf(str, "%s %s %s", buf1, buf2, buf3); printf("%d\n%s\n%s\n%s\n", result, buf1, buf2, buf3); /** * 履行成果: * 3 * i * love * china! * 可以看出,sscanf的前往值為讀取的參數個數 */ //讀取指定長度的字符串 memset(str, 0, sizeof(str)); strcpy(str, "abcdefghijklmnopq"); sscanf(str, "%5s", buf4); printf("%s\n", buf4); /** * 履行成果: * abcde */ //正則婚配字符串 memset(str, 0, sizeof(str)); memset(buf1, 0, sizeof(buf1)); memset(buf2, 0, sizeof(buf2)); memset(buf3, 0, sizeof(buf3)); strcpy(str, "123456abcdedfANDFS"); sscanf(str, "%[0-9]%[a-z]%[A-Z]", buf1, buf2, buf3); printf("%s\n%s\n%s\n", buf1, buf2, buf3); /** * 履行成果: * 123456 * abcdedf * ANDFS * 很難信任c說話居然支撐正則,不外c支撐的正則挺弱的 */ return 0; }
九度ac標題
標題描寫
標題描寫:
有一個收集日記,記載了收集上鉤算義務的履行情形,每一個盤算義務對應一條以下情勢的日記記載:
“hs_10000_p”是盤算義務的稱號,
“2007-01-17 19:22:53,315”是盤算義務開端履行的時光“年-月-日 時:分:秒,毫秒”,
“253.035(s)”是盤算義務消費的時光(以秒計)
hs_10000_p 2007-01-17 19:22:53,315 253.035(s)
請你寫一個法式,對日記中記載盤算義務停止排序。
時光消費少的盤算義務排在後面,時光消費多的盤算義務排在前面。
假如兩個盤算義務消費的時光雷同,則將開端履行時光早的盤算義務排在後面。
輸出:
日記中每一個記載是一個字符串,每一個字符串占一行。最初一行動空行,表現日記停止。日記中最多能夠有10000筆記錄。
盤算義務稱號的長度不跨越10,開端履行時光的格局是YYYY-MM-DD HH:MM:SS,MMM,消費時光小數點後有三位數字。
盤算義務稱號與義務開端時光、消費時光之間以一個或多個空格離隔,行首和行尾能夠有過剩的空格。
輸入:
排序好的日記記載。每一個記載的字符串各占一行。
輸出的格局與輸出堅持分歧,輸出包含幾個空格,你的輸入中也應當包括異樣多的空格。
樣例輸出:
hs_10000_p 2007-01-17 19:22:53,315 253.035(s)
hs_10001_p 2007-01-17 19:22:53,315 253.846(s)
hs_10002_m 2007-01-17 19:22:53,315 129.574(s)
hs_10002_p 2007-01-17 19:22:53,315 262.531(s)
hs_10003_m 2007-01-17 19:22:53,318 126.622(s)
hs_10003_p 2007-01-17 19:22:53,318 136.962(s)
hs_10005_m 2007-01-17 19:22:53,318 130.487(s)
hs_10005_p 2007-01-17 19:22:53,318 253.035(s)
hs_10006_m 2007-01-17 19:22:53,318 248.548(s)
hs_10006_p 2007-01-17 19:25:23,367 3146.827(s)
樣例輸入:
hs_10003_m 2007-01-17 19:22:53,318 126.622(s)
hs_10002_m 2007-01-17 19:22:53,315 129.574(s)
hs_10005_m 2007-01-17 19:22:53,318 130.487(s)
hs_10003_p 2007-01-17 19:22:53,318 136.962(s)
hs_10006_m 2007-01-17 19:22:53,318 248.548(s)
hs_10000_p 2007-01-17 19:22:53,315 253.035(s)
hs_10005_p 2007-01-17 19:22:53,318 253.035(s)
hs_10001_p 2007-01-17 19:22:53,315 253.846(s)
hs_10002_p 2007-01-17 19:22:53,315 262.531(s)
hs_10006_p 2007-01-17 19:25:23,367 3146.827(s)
ac代碼
#include <stdio.h> #include <stdlib.h> #include <string.h> struct mission { char str[200]; char name[20]; int year, month, day, hour, minute, second, micro; double runtime; }; int compare(const void *p, const void *q); int main() { struct mission mis[10001]; int i, n = 0; memset(mis, 0, sizeof(mis)); while(gets(mis[n].str)) { if(strcmp(mis[n].str, "") == 0) { break; } sscanf(mis[n].str, "%s%d-%d-%d %d:%d:%d,%d %lf", mis[n].name, &mis[n].year, &mis[n].month, &mis[n].day, &mis[n].hour, &mis[n].minute, &mis[n].second, &mis[n].micro, &mis[n].runtime); n ++; } qsort(mis, n, sizeof(mis[0]), compare); for(i = 0; i < n; i ++) { printf("%s\n", mis[i].str); } return 0; } int compare(const void *p, const void *q) { const struct mission *a = p; const struct mission *b = q; if(a->runtime > b->runtime) { return 1; }else if(a->runtime == b->runtime && a->year > b->year) { return 1; }else if(a->runtime == b->runtime && a->year == b->year && a->month > b->month) { return 1; }else if(a->runtime == b->runtime && a->year == b->year && a->month == b->month && a->day > b->day) { return 1; }else if(a->runtime == b->runtime && a->year == b->year && a->month == b->month && a->day == b->day && a->hour > b->hour) { return 1; }else if(a->runtime == b->runtime && a->year == b->year && a->month == b->month && a->day == b->day && a->hour == b->hour && a->minute > b->minute) { return 1; }else if(a->runtime == b->runtime && a->year == b->year && a->month == b->month && a->day == b->day && a->hour == b->hour && a->minute == b->minute && a->second > b->second) { return 1; }else if(a->runtime == b->runtime && a->year == b->year && a->month == b->month && a->day == b->day && a->hour == b->hour && a->minute == b->minute && a->second == b->second && a->micro > b->micro) { return 1; }else if(a->runtime == b->runtime && a->year == b->year && a->month == b->month && a->day == b->day && a->hour == b->hour && a->minute == b->minute && a->second > b->second && a->micro == b->micro) { return 0; } else { return -1; } }