一;字符串簡介
字符串(character string)是一個或多個字符的序列。比如:“i am a teacher!” 注意:雙引號不是字符串的一部分,它的作用是告知編譯器它包含起來的內容是字符串。對比單引號用於標識單個字符。
二;char類型數組和null字符
C語言當中,沒有專門存儲字符串的變量類型,字符串都被存儲在char類型的數組當中(數組由聯系的存儲單元組成,同類型數據元素的有序序列)且使用空字符“\0”來標識字符串的結束。詳細如下圖:
注意:字符串和字符是不同的。比如:字符串常量“A”和字符常量‘A’它們的區別在於‘A’是基本類型(char),"A"是派生類型(char 數組)。另外區別“A”實際上是由兩個字符組成的:‘A’+控制符。
三;常量和C預處理量
3.1;符號常量(明示常量)是在編譯程序時,程序中所有的符號常量被替換為定義的初始值,且不會被程序無意間改變值。同時也是方便日后程序的修改。(預編譯器可以使用#include包含其他文件的信息同時也可以用來定義常量)
3.2;定義符號常量格式:#define NAME value (詳細參考下面例子)
#include <stdio.h> #define PI 3.14159 //定義一個PI字符常量 int main(void) { float area, circum, radius; printf("What is the redius of your pizza?\n") scanf("%f",&radius); area = PI * radius * radius; //使用字符常量,編譯過程中自動轉換為數值3.14159 circum = 2.0 * PI * radius; printf("Your basic pizza parameters are as follows:\n"); printf("circumference = %1.2f, area = %1.2f\n",circum,area); return 0; }
四;connst限定符
const關鍵字是C90標准新增的,作用是限定一個變量為只讀。舉例:
const int a = 12; //a變量在程序中不可更改為只讀。具體以后詳細講解:
五;明示常量
明示常量相當於符號常量。常見使用如下:
頭文件limits.h包含明示常量如下:
明示常量 | 含義 |
CHAR_BIT | char類型的位數 |
CHAR_MAX | char類型的最大值 |
CHAR_MIN | char類型的最小值 |
SCHAR_MAX | signned char 類型的最大值 |
SCHAR_MIN | signned char 類型的最小值 |
UCHAR_MAX | unsigned char 類型的最大值 |
SHRT_MAX | short類型的最大值 |
SHRT_MINN | short類型的最小值 |
USHRT_MAX | unsigned char 類型的最大值 |
INT_MAX | int類型的最大值 |
INT_MIN | int類型的最小值 |
UINT_MAX | unsigned int 的最大值 |
LONG_MAX | long類型的最大值 |
LONG_MIN | long類型的最小值 |
ULONG_MAX | unsigned long 類型的最大值 |
LLONG_MAX | long long 類型的最大值 |
LLONG_MIN | long long 類型的最小值 |
ULLONG_MAX | unsigned long log 類型的最大值 |
頭文件float.h包含明示常量如下:
明示常量 | 含義 |
FLT_MANT_DIG | float類型的尾數位置 |
FLT_DIG | float類型的最少有效數字位數(十進制) |
FLT_MIN_10_EXP | 帶全部有效數字的float類型的最小負指數(以10為底) |
FLT_MAX_10_EXP | float類型的最大正指數(以10為底) |
FLT_MIN | 保留全部精度的float類型最小正數 |
FLT_MAX | float類型的最大正數 |
FLT_EPSILON | 1.00和比1.00大的最小float類型值之間的差值 |
六;printf()函數
6.1;printf()函數為輸出函數,且和scanf()函數一起稱之為輸入/輸出函數。
printf()函數格式為:printf(格式字符串,待打印項目1,待打印項目2,。。。) 其中“格式字符串”是雙引號括起來的內容,使用“轉換說明”符號來指定“待打印項目”值代入的位置以及數據轉換可顯示的形式。“待打印項目”可以是常量,變量,表達式。舉例:
#include <stdio.h> #define PI 3.14159 int main(void) { int number = 7; printf("The number is %d\n",number); //%d占位符,轉換說明:有符號的十進制整數 return 0; }
注意:格式字符串中的轉換說明一定要與后面的每個項目匹配。
6.2;轉換說明把以二進制格式存儲在計算機中的值轉換成一系列字符(字符串)以便於顯示。printf()函數常見轉換說明符號如下圖:
轉換說明 | 輸出 |
%a | 浮點數,十六進制數和p計數法(C99/C11) |
%A | 浮點數,十六進制數和p計數法(C99/C11) |
%c | 單個字符 |
%d | 有符號十進制整數 |
%e | 浮點數,e計數法 |
%E | 浮點數,e計數法 |
%f | 浮點是,十進制計數法 |
%g | 根據值的不同,自動選擇%f,%e,%e格式用於指數小於-4或者大於或等於精度時 |
%G | 根據值的不同,自動選擇%f,%e,%e格式用於指數小於-4或者大於或等於精度時 |
%i | 有符號實際值整數 |
%o | 無符號八進制整數 |
%p | 指針 |
%s | 字符串 |
%u | 無符號十進制整數 |
%x | 無符號十進制整數,使用十六進制數0f |
%X | 無符號十進制整數,使用十六進制數0F |
%% | 打印一個百分號 |
6.3;printf()轉換說明修飾符
在%和轉換字符之間插入修飾符可修飾基本的轉換說明,比如:%4d 表示十進制整數位,保留4個最小字段寬度。如下表顯示基本使用修飾符:
修飾符 | 含義 |
標記 | 標記包含5種類,詳細查看下文標記表格。舉例:“%-10d” |
數字 | 最小字段寬度 注意:如果該字段不能容納帶打印的數字或字符串,系統默認會使用更寬的字段。 舉例:“%4d” |
.數字 | 精度 對於%e,%E,%f,轉換,表示小數點右邊數字的位數 對於%g,%G 表示有效數字最大的位數 %s 表示待打印字符的最大數量 整型轉換,表示待打印數字的最小位數 舉例:“%5.2f”打印一個浮點數,字段寬度5字符,其中小數點后面兩位數字 |
h | 和整數轉換說明一起使用,表示short int 或unnsigned short int 類型的值 舉例:“%hu” |
hh | 和整數轉換說明一起使用,表示signed char 或者 unsigned char 類型的值 舉例:“%hhu” |
j | 和整型轉換說明一起使用,表示inntmax_t或uintmax_t類型的值、 舉例:“%jd” |
l | 和整型轉換說明一起使用,表示long int 或 unsigned long int 類型的值 舉例:“%ld” |
ll | 和整型轉換說明一起使用,表示long long int 或 unsigned long long int 類型的值 舉例:“%lld”,"%8lld" |
L | 和浮點轉換說明一起使用,表示long double 類型的值 舉例:“%Ld”,"%10.4Le" |
t | 和整型轉換說明一起使用,表示ptrdiff_t類型的值。ptrdiff_t是兩個指針差值的類型 舉例:“%td”,"%19.3ti" |
z | 和整型轉換說明一起使用,表示size_t 類型的值。size_t是sizeof返回的類型 舉例:“%zd”,"%12zd" |
printf()中的標記,詳細查看如下表格:
標記 | 含義 |
- | 待打印項左對齊。即,從字段的左側開始打印該項 舉例:“%-20s” |
+ | 有符號值為正,則在值前面顯示加號;為負,則在前面顯示減號 舉例:“%+6.3f” |
空格 | 有符號值為正,則在值前面顯示前導空格(不顯示任何符號);為負。則在值前面顯示減號 +標記覆蓋一個空格 舉例:“%6.3f” |
# | 把結果轉換為另一種形式,如果是%o格式,則以0開始;如果是%x 或%X格式,則以0x 或0X開始;對於所有的浮點格式,#保證了即使后面沒有任何數字,也打印一個小數點符號。對於%g和%G格式,#防止結果后面的0被刪除。 舉例:“%#o” |
0 | 對於數值格式,用前導0代替空格填充字段寬度。對於整數格式,如果出現-標記或指定精度,則忽略該標記 |
使用修飾符和標記的實例:
示例一;字段寬度在打印整數時效果。
#include <stdio.h> #define PAGES 959 int main(void) { printf("*%d*\n",PAGES); printf("*%2d*\n",PAGES); //字段寬度為3位數字,規定輸出2個字段寬度。所以默認自動擴大以符合整數成都 printf("*%10d*\n",PAGES); printf("*%-10d*\n",PAGES); return 0; }
運行結果如圖:
示例二;浮點型修飾符組合
。。。。。。
7.4;printf()的返回值
printf()返回值時返回打印字符的個數。
七;scanf()函數
scanf()函數用來輸入數據,因為鍵盤輸入都是文本(字母,數字,標點符號)。比如我要輸入整數2019,就要輸入字符2,0,1,9 。但是計算機存儲的是數值而不是字符串,所以需要通過scanf()函數將字符依次轉換成數值。而printf()函數行為相反。
scanf()函數使用格式:scanf(“格式字符串”,指向變量指針)
格式字符串:用來表明字符輸入流的目標數據類型
指向變量指針:1;如果讀取基本變量類型的值,則變量名稱前加一個&。2;如果是字符串讀入字符數組,不要使用&
使用舉例:
#include <stdio.h> int main(void) { int age; float assets; char pet[30]; printf("Enter your age, assets, and favorite pet.\n"); scanf("%d %f",&age,&assets); scanf("%s",pet); printf("%d $%.2f %s\n",age,assets,pet); return 0; }
演示結果:
7.1;scanf()函數轉換說明如下表:
轉換說明 | 含義 |
%c | 把輸入解釋成字符,包括空白 |
%d | 把輸入解釋成有符號十進制整數 |
%e,%f,%g,%a | 把輸入解釋成浮點數 |
%E,%F,%G,%A | 把輸入解釋成浮點數 |
%i | 把輸入解釋成有符號十進制整數 |
%o | 把輸入解釋成有符號八進制整數 |
%p | 把輸入解釋成指針(地址) |
%s | 把輸入解釋成字符串。從第一個非空白字符開始,到下個空白字符之前的所有字符都是輸入 |
%u | 把輸入解釋成無符號十進制整數 |
%x,%X | 把輸入解釋成有符號十六進制整數 |
7.2;scanf()轉換說明中的修飾符如下表:
轉換說明 | 含義 |
* | 抑制賦值,詳細查看下文“printf()和scanf()的*修飾符” |
數字 | 最大字段寬度。輸入達到最大字段寬度處,或者第一次遇到空白字符停止 舉例:“%10s” |
hh | 把整數作為signed char 或unsigned char 類型讀取 舉例:“%hhd” |
ll | 把整數作為long long 或 unsigned long long 類型讀取 舉例:“%lld” |
j | 在整型轉換說明后面時,表明使用intmax_t 或uintmax_t類型 舉例:“%jd” |
z | 在整型轉換說明后面時,表明使用sizeof的返回類型 |
t | 在整型轉換說明后面時,表明使用表示兩個指針差值的類型 |
h,l,L |
八;printf()和scanf()的*修飾符
如果我們不希望預先定義字段寬度,希望通過程序來指定。那么我們可以使用*來代替字段寬度,但是還是需要使用一個參數來告訴函數具體的字段寬度是多少。舉例如下:
#include <stdio.h> int main(void) { unsigned width, precision; int number = 256; double weight = 242.5; printf("Enter a field width:\n"); scanf("%d",&width) printf("The number is :%*d:\n",width,number); printf("Now enter a width and a precision:\n"); scanf("%d %d",&width,&precision); printf("weight = %*.*f\n",width,precision,weight); //"%*.*f"中兩個*分別被width,precision參數代替 printf("Done!\n"); return 0; }