大家好我是Beilef,一個美好的下我接觸到編程并且逐漸喜歡。我雖然不是科班出身但是我會更加努力地去學,有啥不對的地方請斧正
文章目錄
-
目錄
文章目錄
前言
想必大家對sizeof肯定很了解,那對strlen又了解多少。其實這個問題應該讓不少人困擾。因為我以前也很困擾。甚至感覺他倆差不多,雖然確實有相似之處。
一、strlen的用法
1.strlen函數的原理解析
? ? ? ? ? ? ? ? ? ? ? ? ? ??只有字符串是以\0結尾的!
?3.strlen的用法
答案是14 ,當時我也很懵圈后來才知道空格也算字符
?(一)計數器法
我們只需要告訴小朋友只要看到小雞🐥就停下來,哈哈,沒錯,\0就是那個小雞
?二,遞歸法
?二,sizeof(來咯來咯,他真的來嘍)
一定不要忘了:最后專業的事交給專業的人,字符串用strlen函數求長度,數組類型用sizeof操作符求長度!
總結
如果你看到這里非常感謝,你的三連是對我的鼓勵。有啥不對的請斧正,感謝大家的留言。
前言
想必大家對sizeof肯定很了解,那對strlen又了解多少。其實這個問題應該讓不少人困擾。因為我以前也很困擾。甚至感覺他倆差不多,雖然確實有相似之處。
提示:以下是本篇文章正文內容,下面案例可供參
考
一、strlen的用法
strlen是c語言庫的一個函數,當然啦其他語言也存在。
【strlen]函數所做的是一個計數的工作,它從被指定的地點一直向后數,一直等遇到\0為止。并且返還這一個空間中\0以前的元素個數,不在乎元素的類型大小,只在于元素的個數是多少位。這期間返還的是無符號整型數
1.strlen函數的原理解析
size_t strlen( const char *string )
strlen函數的返回值是【size_t],這是一個無符號類型的整數(unsigned int)。
也就是說我們用了strlen函數就是為了找一個空間內的元素的位數所以strlen不會耍些花的,一定返還一個數值即為元素位數。
?2、它的函數參數為:(const char* string)我們可以怎么理解:由const修飾的指向string(字符串)首元素地址的字符指針。
看到這,真相也大白了:strlen函數所作用的對象是字符串!原因也很直接,因為函數規定:由某個指定位置向后逐個掃描計數,直到遇到'\0'停止并返回計數。我們回想一下:數組與字符串二者誰是以’\0‘結尾呢??
?
? ? ? ? ? ? ? ? ? ? ? ? ? ??只有字符串是以\0結尾的!
?3.strlen的用法
其實strlen的用法非常方便,我們只需將這一段的字符串名放進去然后讓strlen函數自己去計算
然后我們用整形去接受最后的值就可以。
#include<stdio.h>int main()
{int count = 0;char vate[] = "You can do it!";count = strlen(vate);printf("vate的長度是:%d", count);return 0;
}
?大家這里看看這個答案是A11? B12? C13? ?D14
?
答案是14 ,當時我也很懵圈后來才知道空格也算字符
?我們知道如何使用strlen函數后,接下來知道strlen函數的3種模擬實現方法(計數器法? 遞歸法,指針法。)我們來看看吧(小弟水平有限指針法就不講了,希望放過)
?
?(一)計數器法
?計數器法是最簡單最直觀的方法,當然特是最好使用的一個(本人覺得)
#include <stdio.h>
int my_strlen(const char*arr)
{int count = 0;while (*arr++ != '\0'){count++;}return count ;
}int main()
{int count = 0;char arr[10000] ;scanf("%s", arr);count = my_strlen(arr);printf("%d", count );return 0;
}
?為了能更好的理解這個方法我們來舉個例子
my_strlen函數中,字符串就像一群在橋下游過的小鴨子,而count變量就像一個在橋上數鴨子的小朋友,每經過一只鴨子,小朋友用指頭計一個數。但鴨子總會全部游過去,小朋友該怎么停止計數呢?
我們只需要告訴小朋友只要看到小雞🐥就停下來,哈哈,沒錯,\0就是那個小雞
?字符串在傳參的時候,傳出的是字符串的首地址。函數接收后依舊是那個地址,它可以提供給函數訪問一直到遇見\0為止。
?代碼來嘍!!
void my_strlen(const char* vate)
{printf("%s\n", vate);
}int main()
{int count = 0;char vate[] = "You can do it!";my_strlen(vate);return 0;
}
?如果改變了首元素那么就會打印空白。為什么呢
在主函數中,vate字符串的空間已經在內存中被開辟,如果按照正常情況:傳址——接收——順序訪問,過程應該是很絲滑的。而在 函數中對首元素的修改,讓這個字符串指針與后面數據斷開了聯系,你想讓它在修改后再輸出原來的數據,這幾乎是不可能的。
?就像一群狼群,你把頭狼換了后面的狼肯定不服,就會出現重新選擇頭狼。在這里就是沒有結果打印。
2、有了第一點后,我們已經可以保證我們可以訪問這個字符串的全體了,那么接下來我們就需要進行一個while循環條件的設定:如果沒有訪問到字符串中的‘\0‘(*vate++ != '\0'),就一直得逐個向后訪問。
3、最后呢,我們需要安排一個變量,用于每一次進入循環后的++;因為能夠進入到循環中,則說明這個元素是非\0的。
?二,遞歸法
遞歸真的是個很奇妙的的東西,很多人都淹沒在遞歸的用法中。當然哥哥,俺也一樣!!
當我還在迷惑中時突然聽見耳畔傳來一句話,出來混遲早要還的。遞歸就像一個回旋鏢,不管你仍的多遠它終究會回來。一來一回就是遞歸。
?沒錯又是代碼!!
int my_strlen(const char* vate)
{assert(vate != NULL);if (*vate == '\0'){return 0;}else{return 1 + my_strlen(vate + 1);}
}int main()
{int count = 0;char vate[] = "You can do it!";count = my_strlen(vate);printf("vate的長度是:%d", count);return 0;
}
?代碼的輸出還是14,這里就不放了
如果指針vate中的元素不等于'\0',那么進入到else語句:將指針往后移動一位。再次進入if語句中判斷,如果找到'\0\,那么return 0。
?總結一下O(∩_∩)O
1、主函數將字符串名傳入函數,而字符串名則代表的是字符串的首元素地址,故函數使用指針接收。
2、遞歸的使用一定要滿足兩個要點,才算是一個“入門級”的遞歸。(第一:要設置一個“出口”條件。第二:要讓遞歸無限向出口條件靠近。)
?二,sizeof(來咯來咯,他真的來嘍)
?老樣子來一個用法
sizeof的用法如下:
sizeof是C/C++中的一個操作符,用于返回一個對象或者類型所占的內存字節數
1。sizeof有兩種語法形式:
sizeof(type_name):用于獲取類型所占的字節數。如sizeof(int)。
sizeof(object)或sizeof object:用于獲取對象所占的字節數。如sizeof(var_name)或sizeof var_name。變量名可以不用括號括住,但帶括號的用法更普遍2。sizeof操作符不能用于函數類型、不完全類型或位字段。如sizeof(max)若此時變量max定義為int max(),則不是正確形式
3。?sizeof計算對象的大小時,同種類型的不同對象其sizeof值都是一致的
4.sizeof可以對一個表達式求值,編譯器根據表達式的最終結果類型來確定大小,一般不會對表達式進行計算。如sizeof(2+3.14)等價于 sizeof(double)。
5.sizeof也可以對一個函數調用求值,其結果是函數返回類型的大小,函數并不會被調用。
6.C99標準規定,函數、不能確定類型的表達式以及位域(bit-field)成員不能被計算sizeof值3。
注意:在使用sizeof時,需要包含頭文件stdio.h4。
strlen函數與sizeof操作符有什么區別呢?
其實,strlen函數是專門用來計算字符串元素的數量,而sizeof則是用來計算數據類型的大小,兩者或許根本搭不上邊,但因為C語言語法的自由度高,各位大佬們創造出了以下語句,便讓sizeof操作符也可以計算出元素的數量:
sizeof(arr)/sizeof(arr[0])
但同樣的,以上的寫法雖然讓sizeof操作符有了計算元素長度的能力,但也僅僅只作用于數組類型。
1、數組名有兩種情況下代表整個數組元素:sizeof(數組名)、&數組名。只要sizeof取得整個數組元素后,再除以數組的其中一個元素,就可以計算出數組內的元素數量。
2、如果sizeof用于計算字符串長度時,則會發生麻煩,而這個麻煩的引發者也正是'\0'.
#include<stdio.h>
int main()
{int count = 0;char vate[] = "You can do it!";count = sizeof(vate)/sizeof(vate[0]);printf("vate的長度是:%d\n", count);return 0;
}
?這里輸出的就是15
因為sizeof計算的是元素類型的大小,它不像strlen函數,只計數'\0'之前的數位。sizeof在拿到字符串名后,就開始計算全部元素的大小,它才不做選擇,它全要!
最后除以char類型的大小(1)后,就有了:15這個結果~?
一定不要忘了:最后專業的事交給專業的人,字符串用strlen函數求長度,數組類型用sizeof操作符求長度!