初學程式設計(4)
學習的語言:C
編譯環境:visual Studio 2013
選擇的書籍:C Primer Plus(作者:Stephen Prata)
------------------------------------------第4篇--------------------------------------------------------------------------
學習內容:
字串
常量和C前處理器
再談printf()和scanf() 其中涉及函式的引數傳遞和返回值
先上一段核心程式碼
#include "stdio.h" #include "string.h"//使用strlen()函式必須引入的庫 #define DENSITY 1.1//預處理命令:設定一個常量DENSITY,表示人體密度 int main(void)//完成使用者姓名的輸入,計算人的體積 { char name[20]; int weight;float volume; int len;//名字長度 printf("請輸入你的名字:__________\b\b\b\b\b\b\b\b\b\b\b"); scanf("%s", name); len = strlen(name); printf("尊敬的%s,你好!你的名字長度是:%d\n我們這個程式是要計算你的體積,請你告知我們,你的體重是多少(KG)?\n",name,len); scanf("%d", &weight); volume = weight / DENSITY; printf("您的體積是:%.2f", volume); fflush(stdin); getchar(); return 0; }
一、字串
1、字串使用雙引號括起來的,告訴編譯器它是字串。
2、C語言中沒有專門用來儲存字串的變數型別。字串被儲存在char型別的陣列中。
3、什麼是陣列?陣列就是有連續的儲存單元(一個位元組)組成。字串中的字元被儲存在相鄰的儲存單元中,每一個儲存單元一個字元。陣列可以看成是同類型資料元素的有許序列。
陣列的表示方法:char name [40] name後面的方括號表示這是一個數組。40表示元素數量
4、在字串的末尾是‘\0’(空字元),他的作用是標記字串的結束。所以40個儲存單元,只能存放39個字元,還有一個儲存單元要留給空字元。
#include <stdio.h> #define NICKNAME "skydragon" int main(void) { char name[20]; printf("請輸入你的名字:"); scanf("%s",name); printf("%s,你好!,我可以叫你%s嗎?",name,NICKNAME); return 0; }
注意:scanf()遇到空格、製表符或者換行符就不再輸入了。當我們輸入名字“sky dragon”時,scanf()只是輸入了sky這三個字元給name變數。
5、strlen()函式:計算字串中空字元前面的字元個數。
二、常量和C前處理器
常量分為兩種,一種是直白的數字,另一種是符號常量。符號常量有兩個有點,第一就是他表示的常量是可以直白的看出常量含義的,第二就是好更改。
而符號常量的定義有分兩種,一種是宣告變數的方法。還有一種就是#define這種前處理器定義常量值。
何為預處理?前處理器的工作是什麼?其實就是在編譯器編譯之前,把常量做一個替換。
const限制符:用法 const int NUM1 = 233
三、再談printf函式和scanf函式
1、printf函式: 他的引數包括,printf(“格式化字串”,待列印項 ); 待列印項可以是常量,變數,表示式。
1.1、printf的修飾符:有好一些,可以實現不同的輸出格式,這個有需要自己去查。
1.2、轉換說明的意義:把以二進位制格式儲存在計算機中的值轉換成一些列的字元或者字串。也就是待列印項在計算機是以二進位制儲存的,然後要想把它按照相應的格式打印出來,必須有一個轉換說明,計算機才可以正常執行翻譯操作。
1.3、引數傳遞:程式把傳入的值放入被稱為棧(stack)的記憶體區域。其中值的被放入多大的記憶體空間由變數的型別決定,例如int型別的變數就分配4個儲存單位。然後這些被儲存在棧的資料等待printf函式的呼叫,例如此時轉換說明為%d,則printf函式從棧中讀取四個位元組的內容作為這個變數的值。
1.4、返回值:printf函式的返回值,是列印字元的個數。這個值可以賦值給其他變數,來確定輸出是否錯誤(錯誤的話會返回一個負值)。下面看一下函式返回值的賦值程式碼。
int main(void)//測試printf函式的返回值
{
int rv;//返回值賦值的變數
int x=10;
rv = printf("輸出定義的整形變數%d\n", x);
printf("printf函式的返回值%d", rv);
fflush(stdin);
getchar();
return 0;
}
1.5、printf函式換行的方法:這可以自行百度。
2、scanf函式
功能實現與printf函式相反,它把輸入的字元轉換成二進位制數值,儲存在特定的記憶體區域。
也有格式字串和引數列表。格式字串表面字元輸入流的目標資料型別。引數,指向變數的指標。
工作原理:假設scanf根據一個%d轉換說明讀取一個整數。scanf每次讀取一個字元,直到遇到第一個非空白字元開始儲存字元。然後不斷地讀取儲存下一個字元,直至遇到非數字字元停止讀取和輸入。如果最後的字元是非數字字元,那麼scanf會把非數字字元放回輸入,這意味著程式在下一次讀取輸入時,首先讀到的是是上一次讀取丟棄的非數字字元。
特別要注意的是,輸入字元陣列不用使用“&”。下面是程式碼演示:
int main(void)//scanf函式練習
{
int x;//儲存一個整形
char name[20]//儲存字串
scanf("%d,%s",&x,name);//輸入一個十進位制整形,輸入一串字元
printf("%d,%s",x,name);//列印
fflush(stdin);
getchar();
return 0;
}
scanf的返回值:呼叫成功時,返回成功讀取的項數;呼叫失敗,則返回0。下面是程式碼演示:
int main(void)//測試scanf函式
{
int x,y;
int rv;//儲存返回值的變數
rv=scanf("%d", &x);
printf("scanf這次呼叫的返回值是%d\n", rv);
rv = scanf("%d%d", &x, &y);
printf("scanf這次呼叫的返回值是%d", rv);
fflush(stdin);
getchar();
return 0;
}