
c語?格式化符,C語?格式化字符
格式字符控制:
說明:sprintf(格式化后的字符,"%(長度)格式符",格式化前的字符);
1、d格式符。?來輸出?進制數。有以下?種?法:
(1)、%d按整數的實際長度輸出。
(2)、%md,m為指定的輸出字段的寬度。如果數據位數?于m,則左端補以空格,若?于m,則按實際位數輸出。(3)、%ld,輸出長整型
數據。例:longa=135790;printf(“%ld”,a);如果?%d輸出就會發?錯誤,因為整型數據的范圍是-32768到32767.對long型數
據應當?%ld格式輸出,對長整型數據也可以指定字段寬度,如:%8ld。
2、o格式符,以?進制數形式輸出整數。由于內存單元中的各位的值(0或1)按?進制形式輸出,因此輸出的數值不帶符號,即將符號位也
?起作為?進制的?部分輸出。
3、x格式符,以?六進制數形式輸出整數。同樣不會出現負的?六進制數。同樣可以?%lx輸出長整型數,也可以指定輸出字段寬度。
4、u格式符,?來輸出unsigned型數據,即?符號數,以?進制形式輸出。?個有符號整數(int型)也可以?%u格式輸出,反之,?個
unsigned型的數據也可以?%d格式輸出。按相互賦值的規則處理。Unsigned型數據也可以?%x格式輸出。
5、c格式符,?來輸出?個字符。?個字符型數據也可以?整數形式輸出。
6、s格式符,?來輸出?個字符串。
(1)、%s,printf(“%s”,“HELLO”);
(2)、%ms輸出字符串占m列,如字符串本??于m,則突破m的限制,字符串全部輸出,如果?于m,則左補空格。(3)、%-ms如果字符
串?于m,則在m范圍內,字符串向左靠,右補空格。
(4)、%,輸出占m列,但只取字符串中左端n個字符。這n個字符輸出在m列的右側,左補空格。
(5)、%-,其中m,n含義同上,n個字符輸出在m范圍的左側,右補空格。如果n>m,則?動取n值,即保證n個字符正常輸出。
7、f格式符,?來輸出實數(包括單,雙精度),以?數形式輸出。
(1)、%f,不指定字段寬度,有系統?動指定,使整數部分全部如數輸出,并輸出6位?數。應當注意以成長為話題的作文600字 ,并?全部數字都是有效數字。單精
度實數的有效位數?般是7位。
(2)、%指定輸出的數據占m列,其中有n位?數。如果數值長度?于m,則左補空格。
(3)、%-與%基本相同,只是輸出的數值向左端靠,右端補空格。
8、e格式符,以指數形式輸出。
9、g格式符,?來輸出實數,它根據數值的??,?動選擇f格式或e格式(選擇輸出時占寬度較?的?種),且不輸出?意義的零。
*********************************************************
Code
格式
%c
字符
%d
帶符號整數
%i
帶符號整數
%e
科學計數法,使??寫"e"
%E
科學計數法,使??寫"E"
%f
浮點數
%g
使?%e或%f中較短的?個
%G
使?%E或%f中較短的?個
%o
?進制
%s
?串字符
%u
?符號整數
%x
?符號?六進制數,??寫字母
%X
?符號?六進制數,??寫字母
%p
?個指針
%n
參數應該是?個指向?個整數的指針
指向的是字符數放置的位置
%%
?個'%'符號
?個位于?個%和格式化命令間的整數擔當著?個最?字段寬度說明符,并且加上?夠多的空格或0使輸出?夠長.如果你想填充0,在最?字
段寬度說明符前放置0.你可以使??個精度修飾符,它可以根據使?的格式代碼?有不同的含義.
?%e,%E和%f,精度修飾符讓你指定想要的?數位數.例如,
%12.6f
將會?少顯?12位數字,并帶有6位?數的浮點數.
?%g和%G,精度修飾符決定顯?的有效數的位數最?值.
?%s,精度修飾符簡單的表??個最?的最?長度,以補充句點前的最?字段長度.
所有的printf()的輸出都是右對齊的,除?你在%符號后放置了負號.例如,
%-12.4f
將會顯?12位字符,4位?數位的浮點數并且左對齊.你可以修改帶字母l和h%d,%i,%o,%u和%x等類型說明符指定長型和短型數據類型
(例如%hd表??個短整數).%e,%f和%g類型說明符,可以在它們前?放置l指出跟隨的是?個double.%g,%f和%e類型說明符可以置
于字符'#'前保證出現?數點,即使沒有?數位.帶%x類型說明符的'#'字符的使?,表?顯??六進制數時應該帶'0x'前綴.帶%o類型說明符
的'#'字符的使?,表?顯??進制數時應該帶?個'0'前綴.
****************************格式化符在sscanf函數中的強??法*****************************
1.常見?法。
charbuf[512];
sscanf("123456","%s",buf);//此處buf是數組名,它的意思是將123456以%s的形式存?buf中!
printf("%sn",buf);
結果為:123456
2.取指定長度的字符串。如在下例中,取最?長度為4字節的字符串。
sscanf("123456","%4s",buf);
printf("%sn",buf);
結果為:1234
3.取到指定字符為?的字符串。如在下例中,取遇到空格為?字符串。
sscanf("123456abcdedf","%[^]",buf);
printf("%sn",buf);
結果為:123456
4.取僅包含指定字符集的字符串。如在下例中,取僅包含1到9和?寫字母的字符串。
sscanf("123456abcdedfBCDEF","%[1-9a-z]",buf);
printf("%sn",buf);
結果為:123456abcdedf
當輸?:
sscanf("123456abcdedfBCDEF","%[1-9A-Z]",buf);
printf("%sn",buf);
結果為:123456
5.取到指定字符集為?的字符串。如在下例中,取遇到?寫字母為?的字符串。
sscanf("123456abcdedfBCDEF","%[^A-Z]",buf);
printf("%sn",buf);
結果為:123456abcdedf
6、給定?個字符串iios/12DDWDFF@122,獲取/和@之間的字符串,先將"iios/"過濾掉,再將?'@'的?串內容送到buf中
sscanf("iios/12DDWDFF@122","%*[^/]/%[^@]",buf);
printf("%sn",buf);
結果為:12DDWDFF
7、給定?個字符串“hello,world”,僅保留world。(注意:“,”之后有?空格,%s遇空格停?,加*則是忽略第?個讀到的字符串)
sscanf(“hello,world”,"%*s%s",buf);
printf("%sn",buf);
結果為:world
%*s表?第?個匹配到的%s被過濾掉,即hello被過濾了
如果沒有空格則結果為NULL。
sscanf的功能很類似于正則表達式,但卻沒有正則表達式強?,所以如果對于?較復雜的字符串處理,建議使?正則表達式.
//-------------------------------------------------------
?它來分隔類似這樣的字符串2006:03:18:
inta,b,c;
/*sscanf("2006:03:18","%d:%d:%d",a,b,c);*//*錯誤?法,要在變量a,b,c前加上取地址符,modifiedbyhuanmie_09*/
sscanf("2006:03:18","%d:%d:%d",&a,&b,&c);
以及2006:03:18-2006:04:18:
charsztime1[16]="",sztime2[16]="";
sscanf("2006:03:18-2006:04:18","%s-%s",sztime1,sztime2);
但是后來,我需要處理2006:03:18-2006:04:18
僅僅是取消了‘-’兩邊的空格,卻打破了%s對字符串的界定。
我需要重新設計?個函數來處理這樣的情況?這并不復雜,但是,為了使所有的代碼都有統?的風格,我需要改動很多地?,把已有的
sscanf替換成我??的分割函數。我以為我肯定需要這樣做,并伴隨著對sscanf的強烈不滿??睡;?覺醒來,發現其實不必。
format-type中有%[]這樣的typefield。如果讀取的字符串,不是以空格來分隔的話,就可以使?%[]。
%[]類似于?個正則表達式。[a-z]表?讀取a-z的所有字符,[^a-z]表?讀取除a-z以外的所有字符。
所以那個問題也就迎刃?解了:
sscanf("2006:03:18天秤座三 -2006:04:18","%[0-9,:]-%[0-9,:]",sztime1,sztime2);
在softm(Jake)的問題貼(去掉我)n.n(去掉我)et/Expert/topic/4843/?temp=.4321558中,給出了?個很cool的
sscanf?例,?后通過學習,發現sscanf真棒,現做?總結。
搜集?些特殊?法:
%[]的?法:%[]表?要讀??個字符集合,如果[后?第?個字符是”^”,則表?反意思。
[]內的字符串可以是1或更多字符組成。空字符集(%[])是違反規定的,可
導致不可預知的結果。%[^]也是違反規定的。
%[a-z]讀取在a-z之間的字符串,如果不在此之前則停?,如
chars[]="hello,myfriend”;//注意:,逗號在不a-z之間
sscanf(s,“%[a-z]”,string);//string=hello
%[^a-z]讀取不在a-z之間的字符串,如果碰到a-z之間的字符則停?,如
chars[]="HELLOkitty”;//注意:,逗號在不a-z之間
sscanf(s,“%[^a-z]”,string)倉鼠日記 ;//string=HELLO
%*[^=]前?帶*號表?不保存變量。跳過符合條件的字符串。
chars[]="notepad=1.0.0.1001";
charszfilename[32]="";
inti=sscanf(s,"%*[^=]",szfilename);
//szfilename=NULL,因為沒保存
inti=sscanf(s,"%*[^=]=%s",szfilename);
//szfilename=1.0.0.1001
%40c讀取40個字符
%[^=]讀取字符串直到碰到’=’號,’^’后?可以帶更多字符,如:
chars[]="notepad=1.0.0.1001";
charszfilename[32]="";
inti=sscanf(s,"%[^=]",szfilename);
//szfilename=notepad
如果參數格式是:%[^=:],那么也可以從notepad:1.0.0.1001讀取notepad
注意:當碰到不滿?條件的字符后,sscanf就會停?執?,不再掃描之后的字符。
********************strtok字符串分割函數也是個實戰性較強的函數,但是已被strp函數取代***********************
#includechar*strtok(char*str1,constchar*str2);
功能:函數返回字符串str1中緊接“標記”的部分的指針,字符串str2是作為標記的分隔符。如果分隔標記沒有找到,函數返回NULL。為
了將字符串轉換成標記,第?次調?str1指向作為標記的分隔符。之后所以的調?str1都應為NULL。
例如:charstr[]="now#isthetimeforall#goodmentocometothe#aidoftheircountry";chardelims[]="#";char*result
=NULL;result=strtok(str,delims);while(result!=NULL){printf("resultis"%s"n",result);result=strtok(NULL,delims
);}
以上代碼的運?結果是:resultis"now"resultis"isthetimeforall"resultis"goodmentocometothe"resultis"aidoftheir
country"
---------------------------------------------------------------------------------
char*strname=NULL;
strname=(char*)malloc(sizeof(char));
memt(strname,0,sizeof(char));
strcpy(strname,"tong|sun|java|google");
chardelims[]="|";
char*ret=NULL;
ret=(char*)malloc(sizeof(char));
memt(ret,0,sizeof(char));
ret=strtok(strname,delims);
while(ret!=NULL)
{
printf("%sn",ret);
ret=(char*)malloc(sizeof(char));
memt(ret,0,sizeof(char));
ret=strtok(NULL,delims);
}
-------------------------------------------------------------------------------------
strp
baikeViewInfo={id:"2466295",editable:"true",title:"strp",expIndex:"0"};
原型:char*strp(char**stringp,constchar*delim); 功能:分解字符串為?組字符串。從stringp指向的位置起向后掃描,遇到
delim指向位置的字符后,將此字符替換為NULL,返回stringp指向的地址。
*********************strncat字符串截取拼接*********************************
strncat
baikeViewInfo={id:"1028544",editable:"true",title:"strncat",expIndex:"0"};
原型:externchar*strncat(char*dest,char*src,intn); ?法:#include<> 功能:把src所指字符串的前n個字符添加到dest
結尾處(覆蓋dest結尾處的'0')并添加'0'。 說明:src和dest所指內存區域不可以重疊且dest必須有?夠的空間來容納src的字符串。
返回指向dest的指針。 舉例: //strncat.c #include#includemain() { chard[20]="Gol男人手腳冰涼 denGlobal";
char*s="ViewWinIDELibrary"; clrscr(); strncat(d,s,5); printf("%s",d); getchar(); return0; }
以上代碼的運?結果是:
GoldenGlobalView注意view前?有個空格字符。
***********************strncacmp***************************
strncacmp
baikeViewInfo={id:"1589829",editable:"true",title:"strncacmp",expIndex:"0"};
相關:bcmp,memcmp,strcmp,strcoll,strncmp 表頭?件:#include函數定義:intstrncacmp(constchar*s1,const
char*s2,size_tn) 函數說明:strncacmp()?來?較參數s1和s2字符串前n個字符,?較時會?動忽略??寫的差異 返回值
:若參數s1和s2字符串相同則返回0s1若?于s2則返回?于0的值s1若?于s2則返回?于0的值 #include
char*a="acddfefekr";
char*b="AbCddfefekr";
printf("%dn",strncacmp(a,b,2));
以上代碼的運?結果是:1
******************************strcacmp*************************
strcacmp
(忽略??寫?較字符串)
相關函數bcmp牛腩燉柿子 ,memcmp,strcmp,strcoll,strncmp
表頭?件#include<>
定義函數intstrcacmp(constchar*s1,constchar*s2);
函數說明strcacmp()?來?較參數s1和s2字符串,?較時會?動忽略??寫的差異。
此原?這?有錯誤:返回值若參數s1和s2字符串相同則返回0。s1長度?于s2長度則返回?于0的值,s1長度若?于s2長度則返回?于
0的值。
strcacmp是?較兩個字符串,但?較的不是它們的長度,?是字符的編碼??——但字母不區分??寫,如果S1?于S2,返回?于0的
?個整數;如果S1等于S2,返回值是0;如果S1>S2,返回?個?于0的整數。
#include
main()
{
char*a="aBcddfefekr";
char*b="AbCddfefekr";
printf("%dn",strcacmp(a,b)); }
執?aBcDeF=AbCdEf
以上代碼的運?結果是:0
注意與strncacmp()的區別,不要弄混了。
該函數是?進制安全的,且對??寫不敏感。
*************************strncpy*******************************
strncpy:字串復制 原型:char*strncpy(char*dest,char*src,n);
功能:將字符串src中最多n個字符復制到字符數組dest中(它并不像strcpy?樣遇到NULL才停?復制,?是等湊夠n個字符才開始復制),
返回指向dest的指針。
說明:
如果n>dest串長度,dest??臻g溢出產?崩潰異常。
否則:
1)src串長度<=dest串長度,(這?的串長度包含串尾NULL字符)
如果n=(0,src串長度),src的前n個字符復制到dest中。但是由于沒有NULL字符,所以直接訪問dest串會發?棧溢出的異常情況。
如果n=src串長度,與strcpy?致。
如果n=dest串長度,[0,src串長度]處存放于desk字串,(src串長度,dest串長度]處存放NULL。
2)src串長度>dest串長度
如果n=dest串長度,則dest串沒有NULL字符,會導致輸出會有。如果不考慮src串復制完整性,可以將dest最后?字符置為NULL。
綜上,?般情況下,使?strncpy時,建議將n置為dest串長度(除?你將多個src串都復制到dest數組,并且從dest尾部反向操作),復制完
畢后,為保險起見, 將dest串最后?字符置NULL,避免發?在第2)種情況下的輸出亂碼問題。當然嘍,?論是st西紅柿牛腩湯的做法 rcpy還是strncpy,保安全名言警句
證src串長度*******************************snprintf*******************************
snprintf
baikeViewInfo={id:"1966670",editable:"true",title:"snprintf",expIndex:"0"};
intsnprintf(char*str,size,constchar*format,...);
將可變個(...)按照format格式化成字符串,然后將其復制到str中
(1)如果格式化后的字符串長度
(2)如果格式化后的字符串長度>=size,則只將其中的(size-1)個字符復制到str中,并給其后添加?個字符串結束符('0')
函數返回值:若成功則返回欲寫?的字符串長度,若出錯則返回負值。--------------------------------------------
intsnprintf(char*restrictbuf,size_tn,constchar*restrictformat,...);
函數說明:最多從源串中拷貝n-1個字符到?標串中,然后再在后?加?個0。所以如果?標串的??為n
的話,將不會溢出。
函數返回值:若成功則返回欲寫?的字符串長度,若出錯則返回負值。
Result1(推薦的?法)
#include
#include
intmain()
{
charstr[10]={0,};
snprintf(str,sizeof(str),"2345678");
printf("str=%sn",str);
return0;
}
#include//snprintf()
#include<>//strlen()
intmain()
{
chartoname[30];
char*name="yangtaiping";
printf("strlen(name)=%dn",strlen(name));
snprintf(toname,sizeof(toname),"姓名:%s",name);
printf("toname=%sn",toname);
printf("strlen(name)=%dn",strlen(name));
}
strcpy()sprintf()strcat()存在安全隱患,其對應的安全版為:strncpy()snprintf()strncat()。
snprintf(s,100,"%.*S",3,"abcd");s的值為abc%.*s表?有兩項,第?項指定了長度,第?項則是%s的內容,所以取前三位詞條圖冊
更多圖冊
類似的函數還有:
#include
intprintf(constchar*format,...);//格式化輸出到標準輸出設備
intfprintf(FILE*stream,constchar*format,...);//格式化輸出到?件流
intsprintf(char*str,constchar*format,...);//格式化的輸出字符串輸出到str指向的地址空間
本文發布于:2023-03-21 17:42:34,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/167939175414001.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:格式化是什么意思.doc
本文 PDF 下載地址:格式化是什么意思.pdf
| 留言與評論(共有 0 條評論) |