1. 程式人生 > >C語言中scanf(),sscanf(),fscanf()的用法和區別

C語言中scanf(),sscanf(),fscanf()的用法和區別

scanf(),sscanf(),fscanf()區別:
第一個是從控制檯(鍵盤)輸入;
第二個是從字串輸入;
第三個是從檔案輸入;
scanf
scanf()函式根據由format(格式)指定的格式從stdin(標準輸入)讀取,並儲存資料到其它引數. 
 int main()
{
   int a,b,c;
   printf("輸入:a,b,c\n");
   scanf("%d,%d,%d",&a,&b,&c);
   printf("a = %d b = %d c = %d",a,b,c);
   return 0;
}
 
 
 
sscanf
函式sscanf()和scanf()類似, 只是輸入從buffer(緩衝區)中讀取.
sscanf與scanf類似,都是用於輸入的,只是後者以螢幕(stdin)為輸入源,前者以固定字串為輸入源
用法:
%[ ]表示要讀入一個字元集合, 如果[ 後面第一個字元是”^”,則表示反意思。[ ]內的字串可以是1或更多字元組成。空字符集(%[])是違反規定的,可導致不可預知的結果。%[^]也是違反規定的。
 
1. 常見用法。
char buf[512] ;
sscanf("123456 ", "%s", buf);//此處buf是陣列名,它的意思是將123456以%s的形式存入buf中!
printf("%s\n", buf);
結果為:123456
2. 取指定長度的字串。如在下例中,取最大長度為4位元組的字串。
sscanf("123456 ", "%4s", buf);
printf("%s\n", buf);
結果為:1234
3. 取到指定字元為止的字串。如在下例中,取遇到空格為止字串。
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s\n", buf);
結果為:123456
4. 取僅包含指定字符集的字串。如在下例中,取僅包含1到9和小寫字母的字串。
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%s\n", buf);
結果為:123456abcdedf
當輸入: sscanf("123456abcdedfBCDEF","%[1-9A-Z]",buf);
printf("%s\n",buf);
結果為:123456
5. 取到指定字符集為止的字串。如在下例中,取遇到大寫字母為止的字串。
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
printf("%s\n", buf);
結果為:123456abcdedf
6、給定一個字串iios/
[email protected]
,獲取 / 和 @ 之間的字串,
先將 "iios/"過濾掉,再將非'@'的一串內容送到buf中
sscanf("iios/[email protected]", "%*[^/]/%[^@]", buf);
printf("%s\n", buf);
結果為:12DDWDFF
7、給定一個字串“hello, world”,僅保留world。
(注意:“,”之後有一空格,%s遇空格停止,加*則是忽略第一個讀到的字串)
sscanf(“hello, world”, "%*s%s", buf);
printf("%s\n", buf);
結果為:world
%*s表示第一個匹配到的%s被過濾掉,即“hello,”被過濾了
如果沒有空格則結果為NULL。
        


%[a-z] 讀取在 a-z 之間的字串,如果不在此之前則停止,如
 
               char s[]="hello, my friend” ; // 注意: ,逗號在不 a-z之間


               sscanf( s, “%[a-z]”, string ) ; // string=hello
  


%[^a-z] 讀取不在 a-z 之間的字串,如果碰到a-z之間的字元則停止,如


               char s[]="HELLOkitty” ; // 注意: ,逗號在不 a-z之間
 
              sscanf( s, “%[^a-z]”, string ) ; // string=HELLO
 


%*[^=] 前面帶 * 號表示不儲存變數。跳過符合條件的字串。


              char s[]="notepad=1.0.0.1001" ;


               char szfilename [32] = "" ;


               int i = sscanf( s, "%*[^=]", szfilename ) ;// szfilename=NULL,因為沒儲存
 
               intj = sscanf( s, "%*[^=]=%s", szfilename ) ;// szfilename=1.0.0.1001
 
 
%[^=] 讀取字串直到碰到’=’號,’^’後面可以帶更多字元,如:


              char s[]="notepad=1.0.0.1001" ;


              char szfilename [32] = "" ;


               int i = sscanf( s, "%[^=]", szfilename ) ;   // szfilename=notepad
 
               如果引數格式是:%[^=:] ,那麼也可以從 notepad:1.0.0.1001讀取notepad
 
 
fscanf()
功 能: 從一個流中執行格式化輸入,fscanf遇到空格和換行時結束,注意空格時也結束。這與fgets有區別,fgets遇到空格不結束。


int fscanf(FILE *stream, const char *format,[argument...]);
FILE *stream:檔案指標;
char *format:格式字串;
[argument...]:輸入列表。


例1:
FILE *fp;
char a[10];
int b;
double c;
fscanf(fp,"%s%d%lf",a,&b,&c)
返回值:整型,成功讀入的引數的個數
 
例2:
char* filename = "pt.txt";
FILE *fp;
if((fp=fopen(filename,"r"))!=NULL)
 {  
   char str[1024];
   fscanf(fp,"h = %s\n",str);//txt檔案中就類似這種格式:h = dadf;
}