不必定要使用標準C庫的函數進行輸入和輸出。若是不具有或者不喜歡它們,您能夠自行定義,在getchar() putchar()的基礎上創建本身的函數。程序員
假定您但願有一個相似puts()但並不自動添加換行符的函數。程序清單11.10給出了一種方法。數組
程序清單11.10 put1.c程序函數
/*put1.c 不添加換行符打印一個字符串*/ #include <stdio.h> void put1(const char *string) /*不會改變這個字符串*/ { while(*string !='\0') putchar(*string++); }
char指針string最初指向被調參數的第一個元素。因爲這個函數並不改變字符串,所以使用了const修飾符。這一元素的內容輸出之後,指針遞增並指向下一個元素。這個過程一直繼續下去,直到指針指向一個包含空字符的元素。記住,++比*的優先級高,這意味着putchar(*string++)輸出string指向的值,而後再增長string自己,而不是增長stirng指向的字符。指針
能夠把put1.c看做自定義字符串處理函數的範例。每一個字符串都有一個空字符標誌其結束,所以沒必要向函數傳遞字符串的大小。相反,函數依次處理每一個字符直到遇到空字符。code
用數組符號寫這個函數會比較長:索引
int i = 0; while(string[i]!='\0') putchar(string[i++]);
其中用到了一個做爲索引的額外變量。字符串
不少C程序員會在while循環中使用下面的判斷條件:get
while (*string)
當string指向空字符時,*string的值0,這將結束循環。上面的語句被普遍使用。字符串處理
**說明 爲何程序清單11.10用const char *string而不用const char string[]做爲形式參數?從技術上來講,兩者等價,所以它們都有效。用方括號符號的一個用意 是提醒用戶這個函數處理的是數組。但在使用字符串時,實際的參數能夠是數組名、引發來的字符串,或被聲明爲char*類型的變量。使用const char *string能夠提醒您實際的參數不必定是一個數組。string
假定您但願有一個相似puts()的函數,而且這個函數還能夠給出輸出的字符個數。如程序清單11.11所示,添加這一功能很簡單。
程序清單 11.11 put2.c程序
/*put2.c 打印一個字符串,並統計其中的字符個數*/ #include <stdio.h> int put2(const char *string) /*不會改變這個字符串*/ { int count=0; while(*sting) { putchar(*string++); count++; } putchar('\n'); return (count); }
下面的調用輸出字符串pizza:
put2("pizza");
下面的調用還返回一個字符計數值,並把該值賦給num。在本例中這個值是5。
num=put2("pizza") ;
程序清單11.12 給出了一個使用put1()和put2()的驅動程序,其中還使用了嵌套的函數調用。
程序清單11.12 put_put.c 程序
/*put2.c 打印一個字符串,並統計其中的字符個數*/ #include <stdio.h> void put1(const char *string); int put2(const char *string); /*不會改變這個字符串*/ int main(void) { put1("If I'd as much money"); put1(" as I could spend, \n"); printf("I count %d characters.\n", put2("I never would cry old chairs to mend. ")); return 0; } void put1(const char *string) { while(*string) putchar(*string++); } int put2(const char *string) { int count=0; while(*string) { putchar(*string++); count++; } putchar('\n'); return (count); }
咱們使用printf()輸出put2()的值。可是在計算put2()的過程當中,計算機必須先執行這個函數,這樣就輸出了其中的字符串。
If I'd as much money as I could spend, I never would cry old chairs to mend. I count 38 characters.