C 學習筆記day12 標準C語言

2021-08-18 22:52:27 字數 1731 閱讀 4558

字串的輸入:

char str[10] = ;

scanf("%s",char*);

通過這樣的方式是可以從快取區中拿到字串。

如果快取區內的字元長度比字元陣列的長度大,將會產生兩個問題:

1、字串結尾的 '\0' 字元會丟失

2、即使超出了字元陣列的範圍,還是會不斷的往這個字元陣列後面的記憶體繼續寫。這樣就會破壞掉記憶體中的其他資料,很有可能會導致程式停止。

fgets(char*,int,stdin);

通過這樣的方式也可以從快取區中拿到字串。

第乙個引數:字元陣列

第二個引數:陣列大小

第三個引數:使用哪個裝置輸入(stdin)

如果快取區中的字串大小小於第二個引數規定的個數(這個數字不能超過陣列大小,需要把這個規定個數減一,陣列的最後以為會保留給'\0'),會把最後的'\n'字元也讀取到字元陣列。

如果快取區中的字串大小超出了第二個引數規定的個數。剩下的部分會滯留在快取區中,程式的下一次讀取動作將會先讀取之前滯留在快取區中的內容。

這樣的情況是不合理的,我們希望每一次的讀取都是新的內容,所以每次讀取結束之後,我們需要對快取區進行判斷,並保證它是空的。

可以通過這次讀取的最後乙個字元是不是 '\n' ,來判斷快取區中的字元是否讀取完畢。

之後再通過 scanf("%*[^\n"); 刪除快取區中,第乙個'\n'字元前的內容。

通過 scanf("%*c"); 刪除快取區中的'\n'字元。

巨集定義:

#define 巨集名稱  巨集的值

巨集名稱不能帶有任何控制字元(空格,tab,回車)

一般巨集名稱用全大寫的英文本母表示

編譯器再編譯的時候會將原始檔中,所有的巨集名稱,先替換成巨集的值,然後再做下一步。

可以再編譯過程中用以下形式設定巨集的值:

gcc -d巨集名稱=值 原始檔.c

巨集定義可以定義乙個計算過程,把計算過程中的未知數作為巨集的引數。當程式呼叫巨集的時候,會給出具體引數。

#define add(a,b) ((a) * (b))

程式中呼叫巨集的時候,a有可能是乙個複雜的表示式,如果不對a加括號,很有可能會導致最後計算的結果不是預期中的結果。

對整個計算過程加括號也是這個道理,因為程式呼叫巨集的環境很有可能會修改巨集的計算順序。

帶引數的巨集,編譯的過程如下:

先把原始檔中的巨集名稱替換成巨集的值,然後把巨集的引數替換成程式給出的值。然後進行下一步。

傳給巨集的引數,如果巨集對其進行了修改,修改的結果是生效的,程式在把引數傳給巨集時,巨集並沒有像函式一樣為其建立乙個副本,而是直接在這個引數的位址上工作。

在巨集裡最好不要使用遞增或者遞減的操作。

巨集操作符:

#是乙個巨集操作符,可以把巨集的引數變成字元字面值:#define str(n) #n     str(1 + 2); ==>  "1 + 2";

##可以把作為巨集引數傳遞過來的識別符號和巨集的值中的其他部分相連線,變成乙個新的識別符號:#define stt(n) p_##n      int* stt(num); ==>int* p_num;

C語言學習 day12

一 專題學習之陣列 一 陣列的基本概念 1 陣列是一組有序資料的集合,下表代表資料在陣列中的編號 2 用乙個陣列名 如s 和下標 如15 來唯一確定陣列中的元素 3 陣列中的每乙個元素都屬於同乙個資料型別。注 不能把不同的資料型別的資料放在同一陣列中,如 學生的成績和姓名。把陣列與迴圈結合起來可以有...

matlab cody學習筆記 day12

input n 5 output a is 3 3 3 3 3 3 2 2 2 3 3 2 1 2 3 3 2 2 2 3 3 3 3 3 3 如何生成乙個靶心矩陣。答 function a bullseye n a ceil sqrt spiral n 2 0.5 spiral n 命令生成n維從...

C程式設計基礎day12

r 是每次輸出都在最左端。fflush stdout 因為列印的時候不會立即放在螢幕,而是先放在記憶體,再放到快取區等到快取區滿了的時候才放在螢幕。呼叫這個函式後即便快取區沒滿也會將printf的內容顯示到螢幕上。使用快取區是為了提高效率,避免太頻繁地從記憶體往螢幕寫東西,而是先把要顯示的東西存到快...