C言語におけるsscanf()関数の使い方


私の勉強の過程で、ファイルからデータを読み取るのは面倒で、幸いにもsscanf()関数があります.C言語関数sscanf()の使い方sscanf()-指定したフォーマットに一致するデータを文字列から読み込む.関数プロトタイプ:int sscanf(string str,string fmt,mixed var 1,mixed var 2...);  int scanf( const char *format [,argument]... ); 説明:sscanfはscanfと同様に入力に使用されますが、後者はスクリーン(stdin)を入力ソースとし、前者は固定文字列を入力ソースとします.ここでformatは、1つまたは複数の{%[*][width][{h|l|I 64|L}]type|'\t'|'|非%記号}注:1、*はフォーマットにも用いることができ、(すなわち%*dおよび%*s)アスタリスク(*)を付けると、このデータをスキップして読み込まないことを示す.(つまりこのデータをパラメータに読み込まない)2,{a|b|c}はa,b,cのうち1つを表し,[d]はdがあってもなくてもよいことを示す.3、widthは読み取り幅を表します.4,{h|l|I 64|L}:パラメータのsize,通常hは単バイトsize,Iは2バイトsize,Lは4バイトsize(double例外),l 64は8バイトsizeを表す.5、type:これでたくさんです.%s、%dなどです.6、特別な:%*[width][{h|l|I 64|L}]typeはこの条件を満たすフィルタリングされたことを示し、目標パラメータに値を書き込むことなく集合操作をサポートする:%[a-z]はaからzまでの任意の文字をマッチングし、貪欲性(できるだけ多くのマッチング)%[aB']はa、B、'の一員をマッチングし、貪欲性%[^a]はa以外の任意の文字をマッチングし、貪欲性注意:読み込まれた文字列が空の文字列である場合、sscanf関数は読み込まれる文字列の値を変更しません.例:1.よくある使い方.  char buf[512] = ;   sscanf("123456 ", "%s", buf);   printf("%s", buf); 結果:123456.指定した長さの文字列を取ります.次の例では、最大4バイトの文字列をとります.  sscanf("123456 ", "%4s", buf);   printf("%s", buf); 結果:1234.指定した文字までの文字列をとります.次の例では、スペースに遭遇するまで文字列を取ります.  sscanf("123456 abcdedf", "%[^ ]", buf);   printf("%s", buf); 結果:123456 4.指定した文字セットのみを含む文字列を取ります.次の例では、1~9と小文字のみを含む文字列をとります.  sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);   printf("%s", buf); 結果:123456 abcdedf 5.指定した文字セットまでの文字列を取得します.次の例では、大文字に遭遇するまでの文字列をとります.  sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);   printf("%s", buf); 結果:123456 abcdedf 6、指定された文字列iios/12DDWDFF@122、/と@の文字列を取得し、「iios/」をフィルタリングしてから、'@'以外の一連の内容をbufにsscanf(「iios/12DDWDFF@122","%*[^/]/%[^@]",buf);printf("%s",buf);結果:12 DDWDFF 7、文字列「hello,world」が与えられ、worldのみが保持される.(注意:","の後にスペースがある)sscanf("hello,world","%*s",buf);printf("%s",buf);; 結果:world%*sは、最初に一致した%sがフィルタリングされたことを示し、すなわちhelloがフィルタリングされた場合、スペースがなければNULLとなる.sscanfの機能は正規表現に似ているが、正規表現が強くないため、複雑な文字列処理の場合は正規表現を使用することを推奨する.//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------従来、sscanfはスペースで文字列を定義するしかないと思っていましたが、今は私が間違っていることに気づきました.sscanfは実行時関数で、原形は簡単です:int sscanf(const char*buffer、const char*format[,argument]...);その強力な機能はformatのサポートに現れています.私は以前、このような文字列2006:03:18:int a,b,cを区切っていました.  sscanf("2006:03:18", "%d:%d:%d", a, b, c); および2006:03:18-2006:04:18:char sztime 1[16]=「」,sztime 2[16]=「」;  sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2); しかし、その後、私は2006:03:18-2006:04:18を処理する必要があります.「-」の両側のスペースをキャンセルしただけで、%sの文字列の定義を破りました.このような状況を処理するために関数を再設計する必要がありますか?これは複雑ではありませんが、すべてのコードに統一的なスタイルを持たせるために、私は多くの場所を変更し、既存のsscanfを自分の分割関数に置き換える必要があります.私はきっとそうする必要があると思って、sscanfに対する強い不満を伴って寝ました.目が覚めると、実は必要ないことに気づいた.format-typeには%[]のようなtype fieldがあります.読み出された文字列がスペースで区切られていない場合は、%[]を使用します.%[]は正規表現に似ています.[a-z]はa-zを読み出すすべての文字を表し、[^a-z]はa-zを除くすべての文字を読み出すことを表す.だからその問題も解決しました
  sscanf("2006:03:18 - 2006:04:18", "%[0-9,:] - %[0-9,:]", sztime1, sztime2);    
sscanfの機能は正規表現に似ているが、正規表現が強くないため、複雑な文字列の処理では正規表現を使用することを推奨する.
正規表現の基本的な使い方:
1、“.”ワイルドカードの場合、任意の文字を表します.たとえば、「a.c」は「anc」、「abc」、「acc」に一致します.
2、「[]」は、[]内で一致する文字を指定できます.例えば、「a[nbc]c」は「anc」、「abc」、「acc」に一致します.しかし、「ancc」と一致することはできません.aからzは[a-z]と書くことができ、0から9は[0-9]と書くことができます.
3、数量限定記号、マッチング回数(または長さと呼ばれる)を表す記号.
「*」は0回以上
「+」は1回または複数回
“?”0回または1回
「{n}」はn回一致し、nは整数である
「{n,m}」はnからmまでの数の回数に一致する.nもmも整数です.
「{n,}」はnから無限次までの任意の回数に一致する.
「{,m}」は0からmの間の任意の回数に一致する.
数量限定記号は、例えば、電話番号:024-848204820482048204820482(前の3または4桁、後の7または8桁、および中間のマイナス記号があってもなくてもよいと仮定)のように、規定に合致している場合、[0-9]{3,4}-? [0-9]{7,8};注意:「」はエスケープ文字です.「-」は正規表現で範囲を表す意味を使用します.たとえば、前述の[0-9]のように、エスケープ文字「」がエスケープされる必要があります.
4、^がNo記号で、一致したくない記号を表します.例えば、[^z][a-z]+は「z」の先頭を除くすべての字を一致させることができます.
^[]の外側に置くと[]で始まる文字列を表します.^[az][a-z]+は、aまたはzの先頭の長さが2以上の英語文字列を表す.
5、「|」または演算子、例えば、a[n|bc|cb]cは「abcc」、「anc」、「acbc」に一致することができる.
6、「$」はその前の文字で終わる.例えば、ab+$は「abb」、「ab」で一致することができる.
7、いくつかの簡単な表現方法:dは[0-9]を表す;Dは[^0-9];wは[A-Z 0-9];Wは[^A-Z 0-9];sは[trf]を表し、スペース文字にはtab、スペースなどが含まれています.Sは[^trf]を表し、スペース以外の文字である.
解析例を添付します.
 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(){
	char str[100];
	//   :         
	sscanf("12345","%4s",str);
	printf("   
str = %s
",str); // : 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
",year,month,day,hour,minute,second); // : sscanf("12345","%s",str); printf("
str = %s
",str); // :%*d %*s (*) . ( ) sscanf("12345acc","%*d%s",str); printf("
str = %s
",str); // : 。 , '+' 。 sscanf("12345+acc","%[^+]",str); printf("
str = %s
",str); // : 。 , 。 sscanf("12345+acc121","%[^a-z]",str); printf("
str = %s
",str); return 0; }