第四章 printf 和scanf

2021-10-23 23:25:18 字數 1700 閱讀 8924

1.strlen()函式獲取字串的長度

區分sizeof 和 strlen();

char str[20]=「0123456789」;

int a=strlen(str); /*a=10;strlen 計算字串的長度,以\0』為字串結束標記。

int b=sizeof(str); /*b=20;sizeof 計算的則是分配的陣列str[20] 所佔的記憶體空間的大小,不受裡面儲存的內容影響。

strlen 是乙個函式,它用來計算指定字串 str 的長度,但不包括結束字元(即 null 字元)。其原型如下面的**所示:

size_t strlen(char const* str);

也正因為 strlen 是乙個函式,所以需要進行一次函式呼叫,呼叫示例如下面的**所示:

char sarr = 「ilovec」;

/用strlen()求長度/

printf(「sarr的長度=%d\n」, strlen(sarr));

很顯然,上面示例**的執行結果為 6(因為不包括結束字元 null)。這裡需要特別注意的是,函式 strlen 返回的是乙個型別為 size_t 的值,從而有可能讓程式導致意想不到的結果,如下面的示例**所示:

/判斷一/

if(strlen(x)>= strlen(y))

/判斷二/

if(strlen(x)- strlen(y)>= 0)

從表面上看,上面的兩個判斷表示式完全相等,但實際情況並非如此。其中,判斷表示式一沒什麼問題,程式也能夠完全按照預想的那樣工作;但判斷表示式二的結果就不一樣了,它將永遠是真,這是為什麼呢?

原因很簡單,因為函式 strlen 的返回結果是 size_t 型別(即無符號整型),而 size_t 型別絕不可能是負的。因此,語句「if(strlen(x)-strlen(y)>=0)」將永遠為真。

同樣,就算表示式中同時包含了有符號整數和無符號整數,還是有可能產生意想不到的結果,如下面的**所示:

/判斷一/

if(strlen(x)>= 5)

/判斷二/

if(strlen(x)- 5>=0)

很顯然,判斷表示式二的結果還是永遠是真,其原因與上面相同。

關鍵字 sizeof 是乙個單目運算子,而不是乙個函式。與函式 strlen 不同,它的引數可以是陣列、指標、型別、物件、函式等,如下面的示例**所示:

char sarr = 「ilovec」;

/用sizeof求長度/

printf(「sarr的長度=%d\n」, sizeof(sarr));

相對於函式 strlen,這裡的示例**執行結果為 7(因為它包括結束字元 null)。同時,對 sizeof 而言,因為緩衝區已經用已知字串進行了初始化,其長度是固定的,所以 sizeof 在編譯時計算緩衝區的長度。也正是由於在編譯時計算,因此 sizeof 不能用來返回動態分配的記憶體空間的大小。

2.陣列–同型別資料元素的有序序列,陣列末尾的字元 \0 是空字元,標記字串的結束。

c中的字串一定以空字元結束。

3.轉換說明是翻譯說明,%d的意思是「把給定的值翻譯成十進位制整數文字並列印出來」。

4.printf()函式也有乙個返回值,它返回列印字元的個數,通常很少用到,但在檢查輸出錯誤時可能會用到。

5.scanf()中把*放在%和轉換字元之間,會使得scanf()跳過相應的輸出項。在程式需要讀取檔案中特定列的內容時,這項跳過功能很有用。

第四章 繼承

一 為什麼要繼承 在物件導向中我們將具有很多重複內容的類中的內容提取出來,寫成乙個單獨的類 其他類只需要繼承就能取得這些功能,同時可以在自己類中寫入獨特的自定義方法 二 繼承語法 inte ce circle nsobject 繼承是在介面中定義的 冒號後的類名是要整合的類,nsobject 是co...

第四章 物件

三個特性 身份 型別 值 每個物件都有唯一的身份來標識自己,使用內建函式id 得到。例子 usr bin env python coding utf 8 a 32 print a b a print id a id b 結果 d python27 python.exe e workp python ...

第四章 其他

sizeof和strlen 區別sizeof以位元組為單位給出資料的大小,strlen 函式以字元為單位給出字串的長度。使用strlen 函式要加 include標頭檔案。sizeof計算字元時會將標誌字串結束的不可見的空字元計算在內。定義符號常量 方法一 define name value 優點 ...