C Primer Plus 第11章 字符串和字符串函數 11.3 字符串輸出

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) ; 。

相關文章
相關標籤/搜索