strlen和sizeof的初步理解

大家好我是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操作符求長度!

總結


如果你看到這里非常感謝,你的三連是對我的鼓勵。有啥不對的請斧正,感謝大家的留言。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536692.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536692.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536692.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

openmediavault基本操作

omv基本操作 使用hostname訪問共享文件夾設置1.掛載磁盤2.提交更改3.新建用戶4.建立共享文件夾5.設置SMB/CIFS服務7.測試7.1.速度測試 使用hostname訪問 把網口和wifi設置成DHCP,使用hostname訪問,這樣把NAS拿到任何地方都不需要配置了,自動聯網進行訪問. #網絡->常規 #設…

Matlab仿真2ASK/OOK、2FSK、2PSK、QPSK、4QAM在加性高斯白噪聲信道中的誤碼率與歸一化信噪比的關系

本文為學習所用&#xff0c;嚴禁轉載。 本文參考鏈接 https://zhuanlan.zhihu.com/p/667382398 QPSK代碼及高斯白噪聲如何產生 https://ww2.mathworks.cn/help/signal/ref/butter.html 濾波器 https://www.python100.com/html/4LEF79KQK398.html 低通濾波器 本實驗使用matlab仿…

靜態HTTP的優勢:速度、安全性和可擴展性,一個都不能少!

大家好&#xff0c;今天我們來聊聊靜態HTTP的優勢。有人可能會說&#xff1a;“靜態HTTP&#xff0c;不就是那些不會動的網頁嗎&#xff1f;”錯&#xff01;靜態HTTP可不僅僅是靜止不動的&#xff0c;它可是讓網站速度飛快、安全穩定、擴展性強的神器&#xff01;不信&#xf…

鴻蒙插槽?全局插槽和局部插槽?數據不更新?

Builder的基本語法數據是不會響應式的 第一種&#xff1a; 全局插槽&#xff1a;傳入的變量是state數據&#xff08;數據是對象也一樣&#xff09;&#xff0c;但是button點擊更改&#xff0c;并沒有任何反應。規則就是不更新 Entry Component struct Demo02 {State message:…

TomcatHttp協議

1 javaWEB 1.1 Web概述 Web在英文中的含義是網狀物&#xff0c;網絡。在計算機領域&#xff0c;它通常指的是后者&#xff0c;即網絡。像我們前面接觸的WWW&#xff0c;它是由3個單詞組成的&#xff0c;即&#xff1a;World Wide Web&#xff0c;中文含義是萬維網。而我們前…

如何深入理解Java的多態?

在Java中&#xff0c;多態&#xff08;polymorphism&#xff09;是面向對象編程的一個重要概念&#xff0c;它允許你使用一個通用的接口來表示不同的對象和操作這些對象&#xff0c;而不必關心具體的對象類型。多態性有兩種主要形式&#xff1a;編譯時多態&#xff08;靜態多態…

C語言使用qsort和bsearch實現二分查找

引言 在計算機科學領域&#xff0c;查找是一項基本操作&#xff0c;而二分查找是一種高效的查找算法。本博客將詳細解釋一個簡單的C語言程序&#xff0c;演示如何使用標準庫函數qsort和bsearch來對一個整數數組進行排序和二分查找。 代碼解析 包含頭文件 #include <stdi…

數據分析思維

Why&What 數據分析是為了驅動決策賦能業務。在數據分析過程中需要對目標進行拆解量化&#xff0c;如何拆解量化目標便是數據分析思維。 在任務拆解過程中使用的軟件、統計模型、分析方法等為分析工具和手段&#xff0c;如何在恰當的場景合理的使用這些工具、模型、方法、手…

中介者和訪問者模式(行為型設計模式)的 C++ 代碼示例模板

文章目錄 前言代碼倉庫中介者模式&#xff08;Mediator&#xff09;訪問者模式&#xff08;Visitor&#xff09;總結參考資料作者的話 前言 中介者和訪問者模式&#xff08;行為型設計模式&#xff09;的 C 代碼示例模板。 代碼倉庫 yezhening/Programming-examples: 編程實例…

HarmonyOS應用程序包-(下)

HarmonyOS應用程序包-(下) 1.多HAP的開發調試與發布部署流程 多HAP的開發調試與發布部署流程如下圖所示。 圖1 多HAP的開發調試與發布部署流程 開發 開發者通過DevEco Studio工具按照業務的需要創建多個Module&#xff0c;在相應的Module中完成自身業務的開發。 調試 通過…

C++歸并排序詳解以及代碼實現

1. 介紹 歸并排序&#xff08;Merge Sort&#xff09;是一種采用分治法&#xff08;Divide and Conquer&#xff09;策略的排序算法。該算法首先將已有序的子序列合并&#xff0c;得到完全有序的序列。在歸并排序中&#xff0c;合并操作是將兩個有序表合并成一個有序表的過程。…

echarts實現七天天氣預報

效果圖 實現代碼 const imglist {"晴": data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADMAAAAzCAYAAAA6oTAqAAAAAXNSR0IArs4c6QAAByJJREFUaEO9Wl1rFGcUfs67u/nYbOIXJlGopBTx27aQWGOwSMS75sao2BtBQVD/gWCJouA/sIWCBW8M1nqjd1IplW5DYqLWEUoSi9iEjHaJmaz2d05ZWd2Nj…

KingbaseV8R6單實例定時全量備份步驟

此場景為單機數據庫節點內部備份&#xff0c;方便部署和操作&#xff0c;但備份REPO與數據庫實例處于同一個物理主機&#xff0c;冗余度較低。 前期準備 配置ksql免密登錄(必須) 在Kingbase數據庫運行維護中&#xff0c;經常用到ksql工具登錄數據庫&#xff0c;本地免密登錄…

基于OpenCV的圖像顏色與形狀識別的原理

基于 OpenCV 的圖像顏色與形狀識別是通過以下原理實現的&#xff1a; 圖像預處理&#xff1a;首先&#xff0c;將彩色圖像轉換為灰度圖像。這樣做是因為在灰度圖像中&#xff0c;每個像素只有一個顏色通道&#xff0c;可以更方便地進行后續處理。 閾值分割&#xff1a;對灰度圖…

Linux系統編程(六):進程(下)

參考引用 UNIX 環境高級編程 (第3版)嵌入式Linux C應用編程-正點原子 1. 進程與程序 1.1 main() 函數由誰調用&#xff1f; C 語言程序總是從 main 函數開始執行int main(void) int main(int argc, char *argv[]) // 如果需要向應用程序傳參&#xff0c;則選擇該種寫法操作系…

C++ 比 C語言增加的新特性 2

1.C新增了帶默認值參數的函數 1.1 格式 格式&#xff1a;返回值 函數名&#xff08;參數1初始值1&#xff0c;..........&#xff09;{} 例如&#xff1a;void function&#xff08;int a10&#xff09;{} 調用&#xff1a;不需要更改參數的值&#xff1a;function&#x…

基于SSM和微信小程序的高校體育場管理系統

文章目錄 項目介紹主要功能截圖:部分代碼展示設計總結項目獲取方式?? 作者主頁:超級無敵暴龍戰士塔塔開 ?? 簡介:Java領域優質創作者??、 簡歷模板、學習資料、面試題庫【關注我,都給你】 ??文末獲取源碼聯系?? 項目介紹 基于SSM和微信小程序的高校體育場管理系…

文本編輯器:Sublime Text (安裝+漢化)

下載 Sublime Text - Text Editing, Done Righthttps://www.sublimetext.com/Sublime Text官網 支持mac&#xff0c;Linux&#xff0c;Windows 安裝 選擇安裝路徑 next install 選擇安裝位置安裝就行了 漢化 進入了主界面按 CTRLshiftp 輸入install 選擇第一個 彈窗就按確…

服務器擴容未生效、不成功:解決方法

記一次解決服務器擴容未生效的解決辦法 老板&#xff1a;失憶啊&#xff0c;我花錢給服務器擴容了10000000G&#xff0c;但是數據庫和mq都還是用不了&#xff0c;到底是不是服務器磁盤滿了&#xff0c;你到底有沒有查一下什么原因導致服務用不了啊。 失憶&#xff1a;老板您確…

概率論1:下象棋問題(3.5)

每日小語 時刻望著他人的眼色行事&#xff0c;是騰飛不了的。自己怎么想就積極地去做&#xff0c;這是需要膽量的。——廣中平佑 題目 甲、乙二人下象棋&#xff0c; 每局甲勝的概率為a,乙勝的概率為b. 為簡化問題&#xff0c;設沒有和局的情況&#xff0c;這意味著a b1. 設想…