`strlen` 字符串長度函數

1) 函數的概念與用途

strlen 是 C 語言標準庫中最基礎且使用最頻繁的字符串處理函數之一,它的名字來源于"string length"(字符串長度)。這個函數的功能非常明確:計算一個以空字符結尾的字符串的長度

可以將 strlen 想象成一個字符串"尺子":它從字符串的起始位置開始"測量",直到遇到字符串的終止符(\0),然后返回這之間的字符數量(不包括終止符本身)。

典型應用場景包括:

  • 內存分配:在復制或操作字符串前確定所需內存大小
  • 字符串驗證:檢查用戶輸入或外部數據的有效性
  • 循環控制:在遍歷字符串時確定循環邊界
  • 數據序列化:在處理序列化數據時確定字段長度
  • 性能優化:避免在循環中重復計算字符串長度

2) 函數的聲明與出處

strlen 是 C 標準庫(libc)的核心成員,聲明在 <string.h> 頭文件中。

#include <string.h>size_t strlen(const char *s);

這意味著在任何符合標準的 C 開發環境中,只需包含這個頭文件即可使用該函數,無需額外鏈接其他庫。

3) 參數詳解:要測量的字符串

  • const char *s
    • 作用:要計算長度的字符串
    • 要求:必須以 \0 結尾的有效 C 字符串
    • 重要:如果傳入的不是以空字符結尾的字符串,會導致未定義行為(通常會導致函數一直讀取內存直到偶然遇到零字節)

4) 返回值:字符串的長度

  • 返回值類型size_t

    • 這是一個無符號整數類型,用于表示對象的大小或數量
    • 在打印時,通常使用 %zu 格式說明符
  • 返回值含義

    • 返回字符串中字符的數量,不包括終止的空字符
    • 空字符串("")的長度為 0
  • 重要說明

    • 返回值總是非負的
    • 對于非常長的字符串,理論上可能達到 SIZE_MAX(平臺相關的最大值)

5) 實戰演示:多種使用場景

示例 1:基礎用法 - 計算字符串長度

#include <stdio.h>
#include <string.h>int main() {const char *str1 = "Hello, World!";const char *str2 = "";const char *str3 = "中文測試"; // 中文字符串printf("Length of \"%s\": %zu\n", str1, strlen(str1));printf("Length of empty string: %zu\n", strlen(str2));printf("Length of \"%s\": %zu\n", str3, strlen(str3));return 0;
}

示例 2:動態內存分配

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main() {const char *source = "This is a long string that needs to be copied";// 計算所需內存大小(長度 + 1 用于終止符)size_t len = strlen(source);char *copy = malloc(len + 1); // +1 用于終止符if (copy == NULL) {fprintf(stderr, "Memory allocation failed\n");return 1;}// 復制字符串strcpy(copy, source);printf("Original: %s\n", source);printf("Copy: %s\n", copy);printf("Length: %zu characters\n", len);free(copy);return 0;
}

示例 3:字符串遍歷與處理

#include <stdio.h>
#include <string.h>
#include <ctype.h>void reverse_string(char *str) {if (str == NULL) return;size_t len = strlen(str);if (len <= 1) return; // 空字符串或單字符字符串不需要反轉// 使用雙指針技術反轉字符串for (size_t i = 0, j = len - 1; i < j; i++, j--) {char temp = str[i];str[i] = str[j];str[j] = temp;}
}int main() {char text[] = "Hello, World!";printf("Original: %s\n", text);printf("Length: %zu\n", strlen(text));reverse_string(text);printf("Reversed: %s\n", text);return 0;
}

6) 編譯方式與注意事項

編譯命令:

gcc -o strlen_demo strlen_demo.c

關鍵注意事項:

  1. 空終止符要求strlen 依賴于字符串以 \0 結尾,如果不是,會導致未定義行為
  2. 性能特點strlen 的時間復雜度是 O(n),需要遍歷整個字符串直到找到 \0
  3. 返回值類型:返回值是 size_t(無符號類型),與有符號數比較時要注意
  4. 多字節字符:對于多字節字符(如中文),strlen 返回的是字節數而不是字符數
  5. 與相關函數的區別
    • sizeof():運算符,返回對象或類型的大小(包括終止符)
    • strnlen():更安全的版本,可以指定最大檢查長度

7) 執行結果說明

示例 1 輸出:

Length of "Hello, World!": 13
Length of empty string: 0
Length of "中文測試": 12

展示了 strlen 計算不同字符串長度的結果。注意中文字符串的字節數(12)比視覺字符數(4)多,因為中文字符通常占用多個字節。

示例 2 輸出:

Original: This is a long string that needs to be copied
Copy: This is a long string that needs to be copied
Length: 44 characters

演示了如何使用 strlen 確定需要分配的內存大小,并成功復制字符串。

示例 3 輸出:

Original: Hello, World!
Length: 13
Reversed: !dlroW ,olleH

顯示了如何利用字符串長度來實現字符串反轉算法。

8) 總結:strlen 的工作流程與價值

strlen 的工作流程可以總結如下:

調用 strlen(s)
初始化計數器 count = 0
s[count] != '\\0'?
count++
返回 count

strlen 是 C 語言字符串處理工具箱中最基礎且必不可少的函數之一。它的價值在于:

  1. 基礎操作:幾乎所有字符串操作都需要知道字符串長度
  2. 簡單高效:實現簡單,在大多數平臺上都有高度優化的實現
  3. 標準兼容:作為 C 標準庫的一部分,具有高度的可移植性
需要獲取字符串長度
如何選擇方法?
已知編譯時常量字符串
使用 sizeof(s) - 1
需要運行時計算長度
使用 strlen(s)
需要安全版本防止越界
使用 strnlen(s, maxlen)

最佳實踐建議:

  1. 緩存長度:在循環中使用字符串長度時,先計算并存儲長度,避免重復調用 strlen
  2. 注意多字節字符:處理多字節字符時,strlen 返回的是字節數而不是字符數
  3. 確保字符串終止:始終確保字符串以 \0 結尾,否則會導致未定義行為
  4. 考慮安全替代品:在處理不可信輸入時,考慮使用 strnlen 來防止讀取超出預期范圍

strlen 雖然簡單,但卻是 C 語言編程中不可或缺的工具。掌握它的正確用法和注意事項,對于編寫健壯、高效的字符串處理代碼至關重要。無論是處理用戶輸入、操作文本數據還是進行內存管理,strlen 都能提供簡單而有效的解決方案。

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

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

相關文章

TorchInductor - Introduction

PyTorch 2.x通過TorchDynamo通過Python Bytecode的動態變換實現了圖捕獲功能&#xff0c;需要搭配一個Compiler Backend完成圖編譯。 Pytorch嘗試集成了多個后端&#xff0c;并使用一個輕量級的autotuner來選擇最優的后端圖編譯結果。這個解決方案存在2個問題&#xff1a; 這…

Adobe Illustrator默認鍵盤快捷鍵

目錄 默認鍵盤快捷鍵 常用的快捷鍵 處理文檔 選擇工具 查看圖稿 處理所選對象 繪制 編輯形狀 處理實時上色組 處理對象 創建可變寬度點 處理文字 使用面板 動作面板 “畫筆”面板 “字符”和“段落”面板 “顏色”面板 “漸變”面板 “圖層”面板 “色板”…

「數據獲取」《中國能源統計年鑒》(1986-2023)(獲取方式看綁定的資源)

01、數據簡介一、年鑒基本定位與發展歷程《中國能源統計年鑒》作為一部權威性極強的能源領域資料典籍&#xff0c;始終以全面、精準反映中國能源建設推進、生產運行、消費態勢以及供需平衡狀況為核心使命。其編纂工作發軔于 1986 年&#xff0c;最初由國家統計局工業交通統計司…

SpringBoot3系列---【SpringBoot3集成sqlite】

SpringBoot3集成sqlite 1.引入pom.xml <dependencies><dependency><groupId>org.xerial</groupId><artifactId>sqlite-jdbc</artifactId><version>3.34.0</version></dependency><dependency><groupId>com.…

頭部 TTS 開源項目深度對比

語音合成&#xff08;TTS&#xff09;開源項目是技術研究與產業落地的核心支撐&#xff0c;不同項目因技術路線、設計目標差異&#xff0c;在語言覆蓋、合成自然度、可擴展性等方面表現懸殊。本文選取當前開源生態中應用最廣、影響力最大的五大 TTS 項目——MaryTTS、Coqui TTS…

可視化-模塊1-HTML-02

1-新建一個HTML文檔&#xff0c;命名為&#xff1a;week1-12-<h1>標簽<body><h1>這是標題 1</h1> <h2>這是標題 2</h2> <h3>這是標題 3</h3> <h4>這是標題 4</h4> <h5>這是標題 5</h5> <h6>這是…

搜索算法在實際場景中的應用

1. 數據庫系統 B+樹索引 應用場景:關系型數據庫(MySQL、PostgreSQL等)的索引實現 算法特點: 平衡多路搜索樹,優化磁盤I/O 支持范圍查詢和排序操作 典型實現: CREATE INDEX idx_name ON users(last_name); 哈希索引 應用場景:鍵值存儲(Redis、Memcached)、等值查詢 算…

基礎IO

目錄 一、進程和文件的關系 二、背景補充 三、打開文件接口 (1) FILE *fopen(const char* filename , const char *mode) &#xff08;2&#xff09;open 系統調用 文件描述符 open和fopen的關系 &#xff08;3&#xff09;size_t fwrite&#xff08;const void * ptr, …

SpringBoot快速上手

SpringBoot快速上手 環境準備 IDEA版本: 社區版:2021.1-2022.1.4 專業版:無要求 Maven 官方對于Maven的描述: Maven是一個項目管理工具,基于POM(Project Object Model,項目對象模型)的概念,Maven可以通過一小段描述信息來管理項目的構建,報告文檔和項目管理工具軟件. 人…

GitHub Actions workflow最佳實踐

使用 GitHub Actions Workflow 時&#xff0c;遵循最佳實踐可以顯著提升自動化效率、安全性和可維護性。以下是經過實踐驗證的核心最佳實踐&#xff0c;涵蓋配置設計、性能優化、安全防護等維度&#xff0c;并附具體示例&#xff1a; 一、工作流組織與觸發優化 1. 拆分工作流&a…

JAVA讀取項目內的文件或圖片

一、讀取resources下的文件或圖片&#xff1b;文件或圖片位置&#xff1a;代碼&#xff1a;InputStream fis Thread.currentThread().getContextClassLoader().getResourceAsStream("template/" xxx.jpg);二、讀取項目內任意位置的文件或圖片。文件或圖片位置&…

Python如何將兩個列表轉化為一個字典

一、使用zip函數 zip函數是Python內置的一個強大工具&#xff0c;它可以將多個迭代器&#xff08;如列表、元組等&#xff09;“壓縮”成一個迭代器&#xff0c;其中每個元素都是一個元組。使用zip函數將兩個列表轉換為字典是最常見的方法。 1、基本用法 keys [a, b, c] value…

Vue 3 useModel vs defineModel:選擇正確的雙向綁定方案

&#x1f4d6; 概述 useModel() 是 Vue 3.4 版本中引入的一個組合式 API 輔助函數&#xff0c;它是驅動 defineModel() 的底層實現。這個函數主要用于在非單文件組件中實現雙向數據綁定&#xff0c;特別是在使用原始的 setup() 函數時。 ?? 重要提示&#xff1a;如果使用 <…

數據庫備份sql文件過大,phpAdmin無法執行Sql

數據庫導出為sql文件&#xff0c;文件太大導致無法再Sql query執行&#xff0c;可使用命令行執行&#xff1a; windows系統&#xff1a; 1.切換到mysql 安裝目錄的bin目錄下 cd C:\xampp\mysql\bin 2.執行備份sql還原mysql數據庫 mysql -u root -p databasename < C://backu…

三格電子——ModbusTCP 轉 Profinet 主站網關應用實例

型號&#xff1a;SG-TCP- Profinet(M)一、使用場景ModbusTCPClient 通過 ModbusTCP 控制 Profinet 接口設備&#xff0c; Profinet 接口設備接入DCS/工控機等。產品是ModbusTCP和Profinet(M)網關&#xff08;以下簡稱網關&#xff09;&#xff0c;使用數據映射 方式工作。 本產…

網址賬號正確,密碼錯誤返回的狀態碼是多少

問題網址賬號正確&#xff0c;密碼錯誤返回的狀態碼是多少我的回答當賬號正確但密碼錯誤時&#xff0c;服務器通常會返回401 Unauthorized狀態碼。這個狀態碼表示"未授權"&#xff0c;意味著客戶端請求缺乏有效的身份驗證憑據&#xff0c;或者提供的憑據無效。在實際…

JAVA核心基礎篇-操作符

Java 操作符是用于操作變量和值的特殊符號&#xff0c;主要分為以下幾類&#xff1a;1. 算術運算符用于執行基本的數學運算&#xff1a;&#xff1a;加法&#xff08;也可用于字符串拼接&#xff09;-&#xff1a;減法*&#xff1a;乘法/&#xff1a;除法&#xff08;整數相除取…

數據庫字段類型深度解析:從關系型到 NoSQL 的全面指南

數據庫字段類型深度解析&#xff1a;從關系型到 NoSQL 的全面指南 一、引言&#xff1a;數據庫字段類型的重要性 在現代軟件開發和數據管理中&#xff0c;數據庫作為核心組件&#xff0c;其性能、可擴展性和數據完整性在很大程度上取決于字段類型的選擇。作為專業的開發者和數據…

藍牙aoa倉庫管理系統功能介紹

在現代倉儲物流的快節奏運作中&#xff0c;高效管理倉庫人員的位置與行動軌跡&#xff0c;成為提升整體運營效率的關鍵。藍牙AOA&#xff08;Angle of Arrival&#xff0c;信號到達角&#xff09;技術應運而生&#xff0c;以其獨特的優勢和強大的功能&#xff0c;為倉庫人員定位…

【輕量級密碼算法】當安全遇上資源瓶頸:輕量級加密為何成為 IoT 時代的剛需?

在智能家居的場景中&#xff0c;當你輕觸智能門鎖的指紋識別區域&#xff0c;期望它能快速響應并解鎖時&#xff0c;你是否想過在這短短幾秒內&#xff0c;門鎖內部的微控制器&#xff08;MCU&#xff09;正在進行著復雜的安全驗證操作&#xff1f;然而&#xff0c;對于大多數資…