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