1. 程式人生 > 其它 >C語言中sscanf函式的簡明教程

C語言中sscanf函式的簡明教程

技術標籤:C語言學習筆記

C語言中sscanf函式的簡明教程

函式定義

int sscanf(const char *str, const char * format, ...);

函式說明

sscanf()定義於標頭檔案stdio.hsscanf()會將引數str的字串根據引數format字串來轉換並格式化資料。格式轉換形式請參考scanf()。轉換後的結果存於對應的引數內。

返回值

成功則返回引數數目,失敗則返回-1(也即EOF)。

引數中format的說明

format中可以包含一個或多個{%[*][width][length]specifier|' '|'\t'|'\n'|所有非%符號}

注:{a|b|c}表示a,b,c中選一,[d],表示可以有d也可以沒有d。

  • width:寬度,忽略則為貪婪模式
  • length:對specifier進行修飾,指定儲存型別,可選值有hhhllljztL
  • specifier:參考scanf中的specifier

lengthspecifier組合所指定的儲存型別表:

儲存型別表

注:黃色行表示實現標準為C99

支援集合操作:

  • %[a-z] 表示匹配a到z中任意字元,貪婪性(儘可能多的匹配)
  • %[aB’] 匹配a、B、'中一員,貪婪性
  • %[^a] 匹配非a的任意字元,貪婪性
  • %*[^=] 匹配=之前的字串並跳過

注:集合操作的儲存格式只能為char*或wchar_t*,即不能用%[0-9]接收並存儲為int*

例子

  • 貪婪模式(省略width
char result[100];
sscanf("helloworld", "%s", result);
printf("%s", result);  // helloworld
  • 限定長度
char result[100];
sscanf("helloworld", "%5s", result);  // 限定長度為5的字串
printf("%s", result);  // hello
  • 指定lengthspecifier
long long result;
sscanf("8888888888888", "%lld", &result); // 儲存型別為long long int printf("%lld", result); // 8888888888888
  • 接收但忽略部分字元
char result[100];
sscanf("helloworld", "%*5s %s", result);  // %*5s表示接收但忽略5個字元,%s表示接收剩下的字元,format中的空格會被忽略
printf("%s", result);  // world
  • 集合操作
char result[100];
sscanf("abcdefg8888abc", "%[abc]", result);
// 每個字元只能是a、b、c中的一個,一旦不滿足則接收(忽略後面的所有字元,即使可能會再次滿足條件)
printf("%s", result);  // abc
  • 指定長度的集合操作
char result[100];
sscanf("ab12cdefg", "%5[a-z0-9]", result);  // 接收長度為5並且由a到z、0到9字元組成的字串
printf("%s", result);  // ab12c
  • 排除部分字元
char result[100];
sscanf("abcdefg", "%[^d-f]", result);  // 接收由非d、e、f字元組成的字串
printf("%s", result);  // abc
  • 同時接收多個變數
char name[100];
int age;
sscanf("name=zhangsan;age=24", "%*[^=] = %[^;] ; age=%d", name, &age);  // 分別接收name和age並按指定格式儲存
printf("%s\n", name);  // zhangsan
printf("%d\n", age);  // 24