c语言中重要函数
gets函數(shù),從標(biāo)準(zhǔn)輸入讀取一行文本,一行輸入由一串字符組成,以一個(gè)換行符結(jié)尾;
gets函數(shù)丟棄換行符,并在該行的末尾存儲(chǔ)一個(gè)NUL字符(類(lèi)似‘\0’), 然后返回一個(gè)非NULL值。
當(dāng)gets函數(shù)被調(diào)用但事實(shí)上不存在輸入行時(shí),它返回NULL值。
注意點(diǎn):給字符串分配空間加NUL的空間;
格式字符串包含格式指定符(格式代碼)以及普通字符,這些普通字符將按照原樣打印出來(lái);
但每個(gè)格式指定符將使后續(xù)參數(shù)的值按照它所指定的格式打印。
%d 十進(jìn)制打印; %g 打印浮點(diǎn)值;
%o 八進(jìn)制打印; ? %c 打印一個(gè)字符;
%x 十六進(jìn)制打印; %s 打印一個(gè)字符串;
scanf()函數(shù)返回值是函數(shù)成功轉(zhuǎn)換并存儲(chǔ)于參數(shù)中的值個(gè)數(shù);
perror函數(shù)以一種簡(jiǎn)單、統(tǒng)一的方式報(bào)告錯(cuò)誤,perror函數(shù)簡(jiǎn)化向用戶(hù)報(bào)告這些特定錯(cuò)誤的過(guò)程,它的原型定義于stdio.h
void perror(char? const? *message);
如果message不是NULL并且指向一個(gè)非空的字符串。perror函數(shù)就打印出這個(gè)字符串,后面跟一個(gè)分號(hào)和一個(gè)空格。
然后打印出一條用于解釋errno當(dāng)前錯(cuò)誤代碼的信息;
終止執(zhí)行:
exit函數(shù),用于終止一個(gè)程序的執(zhí)行,它的原型定義于stdlib.h
void? exit(int? status);
該函數(shù)的返回值為void;
?
就c程序而言,所有的I/O操作只是簡(jiǎn)單地從程序移進(jìn)或移出字節(jié)的事情。 因此,毫不驚奇的是,這種字節(jié)流便稱(chēng)為流(stream);
程序只需要關(guān)心創(chuàng)建正確的輸出字節(jié)數(shù)據(jù),以及正確地解釋從輸入讀取的字節(jié)數(shù)據(jù),特定I/0設(shè)備的細(xì)節(jié)對(duì)程序員是隱藏;
流分為兩種類(lèi)型:文本(text)流 和二進(jìn)制(binary)流;
stdio.h所包含的聲明之一就是FILE結(jié)構(gòu)。請(qǐng)不要把它和存儲(chǔ)于磁盤(pán)上的數(shù)據(jù)文件相混淆。
FILE是一個(gè)數(shù)據(jù)結(jié)構(gòu),用于訪問(wèn)一個(gè)流,如果你同時(shí)激活量幾個(gè)流,每個(gè)流都有一個(gè)相應(yīng)的FILE與它關(guān)聯(lián),為了流上執(zhí)行一些操作,你調(diào)用一些
合適的函數(shù),并向它們傳遞一個(gè)與這個(gè)流相關(guān)聯(lián)的FILE參數(shù);
?EOF: end of file , 它的實(shí)際值比一個(gè)字符要多幾位,這是為了避免二進(jìn)制值被錯(cuò)誤地解釋為EOF;
I/O函數(shù)以三種基本的形式處理數(shù)據(jù):單個(gè)數(shù)據(jù)、文本行、二進(jìn)制數(shù)據(jù);
對(duì)于每種形式,都有一組特定的函數(shù)對(duì)它們進(jìn)行處理。
數(shù)據(jù)類(lèi)型 輸入 輸出 描述
字符 getchar? putchar? 讀取(寫(xiě)入)單個(gè)字符
文本行 ?? gets puts 文本行未格式化的輸入(輸出)
scanf printf 格式化的輸入(輸出)
二進(jìn)制數(shù)據(jù) fread fwrite 讀取(寫(xiě)入)二進(jìn)制數(shù)據(jù)
字符I/O宏
fgetc 和 fputc 是真正的函數(shù),但getc、putc、getchar 和putchar 都是通過(guò)#define 指令定義的宏;
撤銷(xiāo)字符I/O
int ungetc(int character,?? FILE*? stream);
功能:ungetc 把 一個(gè)先前讀入的字符返回到流中,這樣它可以在以后被重新讀入;
(應(yīng)用:假如你必須從一個(gè)流中逐個(gè)讀入一串?dāng)?shù)字,由于在實(shí)際讀入之前,你無(wú)法知道下一個(gè)字符,你必須連續(xù)讀取,直到讀入一個(gè)非數(shù)字字符,
但是如果你不希望丟棄這個(gè)字符,那么你該怎么辦?
使用ungetc把讀入的字符退還給流,是一個(gè)不錯(cuò)的辦法)
“退回”字符和流的當(dāng)前位置有關(guān),所以如果 用 fseek、 fsetpos、 rewind 函數(shù)改變了流的位置, 所有退回的字符都將被丟棄;
scanf家族:
scanf函數(shù)家族的原型如下所示,每個(gè)原型中的省略號(hào)表示一個(gè)可變長(zhǎng)度的指針列表;
從輸入轉(zhuǎn)換而來(lái)的值逐個(gè)存儲(chǔ)到這些指針參數(shù)所指向的內(nèi)存位置;
int? fscanf(FILE *stream,? char const? *format,? ... );
int scanf( ? ?char const *format,? ... );
int? sscanf(char? const *string,? char? const * format,? ... );
這些函數(shù)都從輸入源讀取字符串并根據(jù)format字符串的格式代碼對(duì)它們進(jìn)行轉(zhuǎn)換。
? fscanf的輸入源? 就是作為參數(shù)給出的流。
?scanf從標(biāo)準(zhǔn)輸入讀取,
sscanf從第1個(gè)參數(shù)所給出的字符串中讀取字符;
對(duì)于scanf函數(shù)的參數(shù)前面為什么要加一個(gè)&符號(hào)?由于c的傳值參數(shù)傳遞機(jī)制,把一個(gè)內(nèi)存位置作為參數(shù)傳遞給函數(shù)的唯一方法是傳遞一個(gè)指向該位置的指針; 在使用scanf函數(shù)時(shí),一個(gè)非常容易出現(xiàn)的錯(cuò)誤是忘記加&符,省略這個(gè)符號(hào)將導(dǎo)致變量的值作為參數(shù)傳遞給函數(shù),
而scanf函數(shù)(或者其它兩個(gè))卻把它解釋為一個(gè)指針,當(dāng)它被解引用時(shí),要么導(dǎo)致程序終止(試圖修改非法的地址);要么導(dǎo)致一個(gè)不可預(yù)測(cè)的內(nèi)存位置的數(shù)據(jù)被修改;
sscanf函數(shù)說(shuō)明:int? sscanf(const char? *str,? const? char * format,? .......);
sscanf()會(huì)將參數(shù)str的字符串(一定要是字符串), 根據(jù)參數(shù)format來(lái)轉(zhuǎn)換并將格式化數(shù)據(jù),轉(zhuǎn)換后的結(jié)果存于對(duì)應(yīng)的參數(shù)內(nèi);
返回值: 成功則返回參數(shù)數(shù)目, 失敗則返回-1;錯(cuò)誤原因存于errno中。返回0表示失敗,否則,表示正確格式化數(shù)據(jù)的個(gè)數(shù)。
例如:sscanf(str ,?? "%d %d %s",? &i, &i2,? &s);? 如果三個(gè)均成功返回3, 如果只讀入了第一個(gè)整數(shù)到i則會(huì)返回1,證明無(wú)法從str讀入第二個(gè)整數(shù);
char input[] = "10.10.aaaaaa.bbbbbb";
sscanf(input,? "%d.%d.%5[a-z] %*s %f”,&i,&j,s,s);
printf(“%d %d %s ”,i,j,s);
執(zhí)行: 10 10 aaaaa
常見(jiàn)用法:
char ?str[512] = {0};
sscanf("123456", "%s", str);
printf("str=%s", str);
2.取指定長(zhǎng)度的字符串。如下:
sscanf("123456", "%4s", str);
printf("str = %s", str);
3. 取到指定字符為止的字符串。如在下例中,取遇到空格為止字符串。 ?//驗(yàn)證有問(wèn)題,還是沒(méi)明白其意思呢
?
sscanf("123456abcdedf","%[^]",str);
?
? printf("str=%s", str);
? 4、取僅包含指定字符集的字符串,如下,取僅包含1到9和小寫(xiě)字母的字符串;
sscanf("123456abcdedfBCDEF","%[1-9a-z]",str);
printf("str=%s",str);
? 5、取到指定字符集為止的字符串,如下,取遇到大寫(xiě)字母為止的字符串;
sscanf("123456abcdedfBCDEF","%[^A-Z]", str);
printf("str=%s",str);
***************************************************************
可以用如下代碼將字符串形式的ip地址轉(zhuǎn)換為四個(gè)整數(shù):
以下部分還沒(méi)用到:??
注意sscanf_s,當(dāng)讀入的類(lèi)型是整數(shù)或其它長(zhǎng)度可以確定的類(lèi)型時(shí),不能在類(lèi)型后面跟上長(zhǎng)度,但是對(duì)于字符串類(lèi)型(char *)長(zhǎng)度無(wú)法得知?jiǎng)t必須在類(lèi)型后面明確指出字符串的最大長(zhǎng)度(即可以容納的空間)。舉例如下:
1 // crt_sscanf_s.c 2 // This program uses sscanf_s to read data items 3 // from a string named tokenstring, then displays them. 4 5 #include <stdio.h> 6 #include <stdlib.h> 7 8 int main( void ) 9 { 10 char tokenstring[] = "15 12 14..."; 11 char s[81]; 12 char c; 13 int i; 14 float fp; 15 16 // Input various data from tokenstring: 17 // max 80 character string plus NULL terminator 18 sscanf_s( tokenstring, "%s", s, _countof(s) ); 19 sscanf_s( tokenstring, "%c", &c, sizeof(char) ); 20 sscanf_s( tokenstring, "%d", &i ); 21 sscanf_s( tokenstring, "%f", &fp ); 22 23 // Output the data read 24 printf_s( "String = %s\n", s ); 25 printf_s( "Character = %c\n", c ); 26 printf_s( "Integer: = %d\n", i ); 27 printf_s( "Real: = %f\n", fp ); 28 }對(duì)于多個(gè)字符串讀入的情況,代碼如下:
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/chris-cp/p/3746151.html
總結(jié)
- 上一篇: css3中transform的用法
- 下一篇: forget password of W