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
根據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型別。 |