11.3.1 puts( )函數數組
puts( )函數的使用很簡單,只須要給出字符串參數的地址。程序清單11.8列出了輸出字符串的多種方式。ide
程序清單11.8 put_out.c程序函數
/*put_out.c 使用puts( )函數*/ #include<stdio.h> #define DEF "I am a #define string." int main(void) { char str1[80]="An array was initialized to me."; const char * str2 ="A pointer was initialized to me."; puts("I'm an argument to puts( ). "); puts(DEF); puts(str1); puts(str2); puts(&str1[5]); puts(str2+4); return 0; }
輸出以下:設計
I'm an argument to puts( ). I am a #define string. An array was initialized to me. A pointer was initialized to me. ray was initialized to me. inter was initialized to me.
注意,每一個字符串都單行顯示。與printf()不一樣,puts()顯示字符串時,自動在其後面過添加一個換行符。指針
這個例子,讓人想起雙引號中的字符是字符串常量,並被看做地址。一樣,字符數組字符串的名字也被看做是地址。表達式&str1[5]是數組str1的第6個元素的地址。這個元素包含字母‘r’,它也正是puts()輸出字符串的起點。與之相似,str2+4指向包含'i'的那個內存單元。puts()如何知道什麼時候中止?遇到空字符它就會停下來,因此應該確保有空字符存在。不要效仿程序清單11.9中的程序。code
/*nono.c 不要效仿這個程序*/ #include<stdio.h> int main(void) { char side_a[]='SIDE A'; char dont[]={'w','o','w','!'}; char side_b[]='SIDE B'; puts(dont); return 0; }
dont缺乏一個表示結束的空字符,因它它不是一個字符串,這樣puts()就不知道應該到哪裏中止。它只是一直輸出內存中dount後面的字符,直到發現一個空字符。內存
11.3.2 fputs( ) 函數字符串
fputs( )是puts( )的面向文件版本。二者之間的區別是:get
一、fputs()須要第二個參數來講明要寫的文件。可使用stdout做爲參數來進行輸出顯示,stdout在stdio.h中定義。string
二、與puts()不一樣,fputs()並不爲輸出自動添加換行符。
注意,gets()丟掉輸入時裏的換行符,可是puts()爲輸出添加換行符。另外一方面,fgets()存儲輸入中的換行符,而fputs()也不爲輸出添加換行符。假定寫一個循環,讀取一行並把它回顯在下一行,能夠這麼寫:
char line [81]; while(gets(line)) puts(line);
回憶一下,若是遇到文件結尾,gets()就返回空指針。空指針的值爲0(也即假),這樣就結束了循環。或者也能夠這麼作:
char line [81]; while(fgets(line,81,stdin)) fputs(line,stdout);
在第一個循環中,line數組中的字符串被顯示在單獨的一行上,這是因爲puts()爲它添加了一個換行符。第二個循環,line數組中的字符串一樣被顯示在單獨的一行上,這是因爲fgets()存儲了一個換行符。注意,若是把fgets()和puts()輸出結合使用,每一個字符串後就會顯示兩個換行符。關鍵在於,puts()是爲和gets()一塊兒使用而設計的,而fputs()是爲和fgets()一塊兒使用而設計的。
11.3.3 printf()函數
printf( )函數使用起來沒有puts()那麼方便,可是它能夠格式化多種數據類型,於是更通用。
它位的區別 之一就是printf()並不自動在新行上輸出每個字符串。相反,您必須指明須要另起一行的地方。所以:printf("%s\n",string) ; 與下面的語句效果同樣puts(string) 。
正如您所見,第一種形式須要鍵入更多的代碼,此外計算機須要的執行時間更長。不過,printf()使在一行上輸出多個字符串變得更爲簡單。例如:printf("well, %s, %s\n",name,MSG) ; 。