1. 程式人生 > >C字串輸入輸出

C字串輸入輸出

1.char陣列型別和空字元

  C沒有為字串定義專門的變數型別,而是把它儲存在char數組裡。陣列的最後一個位置顯示字元\0。這個字元就是空字元,C用它來標記字串的結束,其ASCII碼的值為(或者等同於)0。C的字串儲存時通常以這個空字元結束,該字元的存在意味著陣列的單元數必須至少比要儲存的字元數多1。計算機可以自己處理大多數這些細節問題(例如,scanf( )會新增'\0'使得陣列內容成為C字串)。

2.strlen( )函式與sizeof運算子

  sizeof運算子以位元組為單位給出資料的大小,strlen( )函式以字元為單位給出字串的長度。

複製程式碼
#include<stdio.h>
#include
<string.h> /*提供strlen( )函式的原型*/ #define PRAISE "What a super marvelous name!" int main(void) {   char name[40];   printf("What's your name?\n");   scanf("%s",name);   printf("Hello, %s, %s\n", name, PRAISE);   printf("Your name of %d letters occupies %d memory cells.\n", strlen(name), sizeof
(name));   printf("The phrase has %d letters", strlen(PRAISE));   printf("and occuples %d memory cells .\n", sizeof(PRAISE));   return 0; }  
複製程式碼

  輸出結果:

    What's your name?

    Morgan Buttercup

    Hello, Morgan. What a super marvelous name;

    Your name of 6 letters occupies 40 memory cells.

    The phrase of praise has 28

 letters and occupies 29 memory cells.

  根據sizeof運算子的報告,陣列name有40個記憶體單元。不過只用了其中前6個單元來存放Morgan,這是strlen( )所報告的。陣列name的第七個單元中放置空字元,它的存在告訴strlen( )在哪裡停止計數。

  對於PRAISE,你會發現strlen( )再一次給出了字串中字元(包括空格和標點符號)的準確數目。Sizeof運算子提供給您的數目大1,這是因為它把用來標誌字串結束的不可見的空字元也計算在內。您並沒有告訴計算機為儲存該語句分配多大記憶體,它必須自己計算出雙引號之間的字元的數目。

3.常量

  1)前處理器允許定義常量,只需在程式檔案的頂部新增如下資訊即可:

      #define TAXRATE 0.015

    當編譯你的程式時,值0.015將會在TAXRATE出現的每個地方代替它。

  2)使用const關鍵字把一個變數宣告轉化成常量宣告:

    const int MOUTHS = 12;

4.printf( )和scanf( )

  printf( )函式也有一個返回值,它返回所列印的字元數目;

  scanf的返回值有後面的引數決定:

  scanf("%d%d", &a, &b);

  如果a和b都被成功讀入,那麼scanf的返回值就是2

  如果只有a被成功讀入,返回值為1

  如果a和b都未被成功讀入,返回值為0

  如果遇到錯誤或遇到end of file,返回值為EOF。

  且返回值為int型.

  如果使用scanf( )來讀取某種變數型別的值,請在變數名之前加上&。

  如果使用scanf( )把字串讀進一個字元陣列,請不要在變數名之前加上&。

  要列印%,應該使用%%。

  空白字元包括空格,製表符,換行符。C使用空白字元分隔各個語言符號:scanf( )使用空白字元分隔相鄰的輸入項。

格式轉換說明符printf() / scanf()

                  表一 轉換說明符及作為結果的列印輸出

轉換說明

輸 出

%a

浮點數、十六進位制數字和p-記數法 (C99)

%A

浮點數、十六進位制數字和P-記數法 (C99)

%c

一個字元

%d

有符號十進位制整數

%e

浮點數、e-記數法

%E

浮點數、E-記數法

%f

浮點數,十進位制記數法

%g

根據數值不同自動選擇%f或者%e。%e格式在指數小於-4或者大於等於精度時使用

%G

根據數值不同自動選擇%f或者%E。%E格式在指數小於-4或者大於等於精度時使用

%i

有符號十進位制整數 (與%d相同)

%o

無符號八進位制整數

%p

指標(就是指地址)

%s

字串

%u

無符號十進位制整數

%x

使用十六進位制數字0f 的無符號十六進位制整數

%X

使用十六進位制數字0F的無符號十六進位制整數

%%

列印一個百分號

                  表二 printf() 修飾符

修飾符

意 義

標誌

五種標誌 (-、+、空格、# 和0) 都將在表三中描述,可以使用零個或多個標誌

digit(s)

欄位寬度的最小值。如果該欄位不能容納要列印的數或者字串,系統會使用更寬的欄位。示例:“%4d”

.digit(s)

精度。對於%e、%E和%f轉換,是將要在小數點的右邊列印的數字的位數。對於%g和%G轉換,是有效數字的最大位數。對於%s轉換,是將要列印的字元的最大數目。對於整數轉換,是將要列印的數字的最小位數;如果必要,要使用前導零來達到這個位數。只使用“.”表示其後跟隨一個零,所以%.f與%.0f相同。示例:“%5.2f”列印一個浮點數,他的欄位寬度為5個字元,小數點後有兩個數字。

h

和整數轉換說明符一起使用,表示一個short int 或者 unsigned short int 型別數值。

示例:“%hu”、“%hx”和“%6.4hd”

hh

和整數轉換說明符一起使用,表示一個signed char 或者unsigned char型別數值。

示例:“%hhu”、“%hhx”和“%6.4hhd”

j

和整數轉換說明符一起使用,表示一個intmax_t或uintmax_t值。

示例:“%jd”和“%8jX”

l

和整數說明符一起使用,表示一個long int 或者unsigned long int 型別值。

示例:“%ld”和“%8lu”

ll

和整數說明符一起使用,表示一個long long int或 unsigned long long int 型別值 (C99)。

示例:“%lld”和“%8llu”

L

和浮點轉換說明符一起使用,表示一個long double值。

示例:“%Lf”和“%10.4Le”

t

和整數轉換說明符一起使用,表示一個ptrdiff_t值(與兩個指標之間的差相對應的型別) (C99)

示例:“%td”和“%12ti”

z

和整數轉換說明符一起使用,表示一個size_t(sizeof返回的型別) (C99)

示例:“%zd”和“%12zx”

                  表三 printf()的標誌

修飾符

意 義

-

專案是左對齊的,也就是說,會把專案列印在欄位的左側開始處。示例:“%-20s”

+

有符號的值若為正,則顯示帶加號的符號;若為負,則帶減號的符號。示例:“%+6.2f”

(空格)

有符號的值若為正,則顯示時帶前導空格(但是不顯示符號);若為負,則帶減號符號。+標誌會覆蓋空格標誌。示例:“% 6.2f”

#

使用轉換說明的可選形式。若為%o格式,則以0開始;若為%x和%X格式,則以0x或0X開始,對於所有的浮點形式,#保證了即使不限任何數字,也列印一個小數點字元。對於%g和%G格式,它防止尾隨零被刪除。示例:“%#o”、“%#8.0f”和“%+#10.3E”

0

對於所有的數字格式,用前導零而不是用空格填充欄位寬度。如果出現-標誌或者指定了精度(對於整數)則忽略該標誌。示例:“%010d”和“%08.3f”

                  表四 ANSIC 中 scanf()的轉換說明符

轉換說明符

意 義

%c

把輸入解釋成一個字元

%d

把輸入解釋成一個有符號十進位制整數

%e,%f,%g, %a

把輸入解釋成一個浮點數 (%a是C99標準)

%E,%F,%G,%A

把輸入解釋成一個浮點數 (%A是C99標準)

%i

把輸入解釋成一個有符號十進位制整數

%o

把輸入解釋成一個有符號八進位制數

%p

把輸入解釋成一個指標(地址)

%s

把輸入解釋成一個字串;輸入的內容以一個非空白字元作為開始,並且包含知道下一個空白字元的全部字元

%u

把輸入解釋成一個無符號十進位制整數

%x,%X

把輸入解釋成一個有符號十六進位制整數

                  表五 scanf()的轉換修飾符

修飾符

意 義

*

滯後賦值。示例:“%*d”

digit(s)

最大欄位寬度;在達到最大欄位寬度或者遇到第一個空白字元時(不管哪一個先發生都一樣)停止對輸入項的讀取。示例:“%10s”

hh

把整數讀作signed char 或 unsigned char 。示例:“%hhd”“%hhu”

ll

把整數讀作long long或者 unsigned long long (C99)。示例:“%lld”“%llu”

h,l或L

“%hd”和“hi”指示該值將會儲存在一個short int中。

“%ho”“%hx”和“%hu”指示該值將會儲存在一個unsigned short int中。

“%ld”和“%li”指示該值將會儲存在一個long中。

“%lo”“%lx”和“%lu”指示該值將會儲存在一個unsigned long中。

“%le”“%lf”和“%lg”指示該值以double型別儲存。將L(而非l)與e、f和g一起使用指示該值以long double型別儲存。

如果沒有這些修飾符,d、i、o和x指示int型別,而e、f和g指示float型別。