015-C語言字符函數和字符串函數

C語言字符函數和字符串函數

文章目錄

  • C語言字符函數和字符串函數
    • 1. 字符分類函數
    • 2. 字符轉換函數
    • 3. strlen
    • 4. strcpy
    • 5. strcat
    • 6. strcmp
    • 7. strncpy
    • 8. strncat
    • 9. strncmp
    • 10. strstr
    • 11. strtok
    • 12. strerror

1. 字符分類函數

C語言中有一系列函數是專門做字符分類的,也就是判斷一個字符屬于什么類型。

使用這些函數需要包含頭文件ctype.h

函數如果參數滿足下面條件就為真
iscntrl任何字符
isspace空白字符:空格 ' '、換頁 '\f'、換行 '\n'、回車 '\r'、制表符 '\t'、垂直制表符 '\v'
isdigit十進制數字0~9
igxdigit十六進制數字1~9a~fA~f
islower小寫字母a~z
isupper大寫字母A~Z
isalpha字母a~zA~Z
isalnum字母或數字a~zA~Z0~9
ispunct標點符號,任何不屬于字母或數字的可打印字符
isgraph任何圖形字符
isprint任何可打印字符,包括圖形字符和空白字符

使用這些函數的方法幾乎都是一樣的,只需要傳入需要判斷的字符,然后接受對應返回值即可。

2. 字符轉換函數

C語言提供了2個字符轉換函數。

使用這些函數需要包含頭文件ctype.h

函數作用
tolower將傳進去的小寫字母轉成大寫
toupper將傳進去的大寫字母轉成小寫

3. strlen

size_t strlen(const char * str)

我們在之前就已經使用過很多次strlen函數,這里做一下總結:

  • 字符串以'\0'作為結束標志,strlen函數返回值是在字符串中'\0'前面出現的個數。
  • 參數指向的字符串必須要以'\0'結束。
  • 注意函數的返回值為size_tsize_t本質上是無符號整數。
#include <stdio.h>
#include <string.h>int main()
{const char* str = "hello world";printf("%d\n", strlen(str)); // 11return 0;
}

在這里插入圖片描述

4. strcpy

char * strcpy(char * destination, const char * source);
  • 函數參數:

    • destination:目標字符串。
    • source:源字符串。
    • 源字符串的內容將會拷貝到目標字符串中。
  • 源字符串必須以'\0'結束。

  • 源字符串中的'\0'會被拷貝到目標字符串中。

  • 目標字符串的空間必須足夠大,保證能夠放得下源字符串的內容

  • 目標空間必須可變(非const)。

  • 注意,在VS2022環境下無法直接使用strcpy,解決辦法是加上#define _CRT_SECURE_NO_WARNINGS

    在這里插入圖片描述

    在后文有部分函數也會出現這個問題,看到這個警告后,按上述處理即可,后文將不再贅述此類問題。

#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world";char str2[20];strcpy(str2, str1);printf("%s", str2);return 0;
}

在這里插入圖片描述

5. strcat

char * strcat ( char * destination, const char * source );
  • 函數參數:

    • destination:目標字符串。
    • source:源字符串。
    • 源字符串中的內容將被追加到目標字符串。
  • 源字符串必須以'\0'結束。

  • 目標字符串也必須以'\0'結束。

  • 目標空間必須足夠大,保證能放得下追加后的內容。

  • 目標空間必須可變。

#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world";char str2[20] = "123456";strcat(str2, str1);printf("%s", str2);return 0;
}

在這里插入圖片描述

6. strcmp

int strcmp ( const char * str1, const char * str2 );
  • 函數參數

    • 兩個待比較的字符串。
    • 比較規則,按照字典序比較:
      • 從前往后比較兩個字符串相同位置的字符。
      • 當字符的ACSII碼值小時,則該字符串更小,反之該字符串更大。
      • 當字符相同時,比較下一個位置的字符。
      • 當字符串1到末尾時,字符串2還未結束,那么字串1比字符串2小。
      • 當兩個字符串內容完全一致時,判定為相等。
  • 第一個字符大于第二個字符串則返回大于0的數字。

  • 兩個字符串相等則返回0。

  • 第二個字符串大于第一個字符串則返回小于0的數字。

#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world123";const char* str2 = "hello world456";int tmp = strcmp(str2, str1);if (tmp > 0)printf("str2 > str1\n");else if (tmp == 0)printf("str2 == str1\n");elseprintf("str2 < str1\n");return 0;
}

在這里插入圖片描述

7. strncpy

char * strncpy ( char * destination, const char * source, size_t num );
  • 函數參數:
    • 與strcpy不同的,num代表需要從源字符串拷貝的字符個數。
  • 如果源字符串的長度小于num,則拷貝完源字符串后,在目標后面追加\0,直到num個。
  • 需要注意的是,如果num小于source的長度,那么destination字符串的最后將不會有\0,打印時可能會造成越界訪問。
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world";char* str2[20];char* str3[20];strncpy(str2, str1, 20);strncpy(str3, str1, 5);printf("%s\n", str2);printf("%s\n", str3);return 0;
}

在這里插入圖片描述

上面打印的str3就出現了越界訪問的問題。

8. strncat

char * strncat ( char * destination, const char * source, size_t num );
  • 函數參數:
    • 與strcat不同的,num代表需要從源字符串追加的字符個數。
  • 如果源字符串長度小于num,則追加整個源字串。
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world";char str2[20] = "123";char str3[20] = "456";strncat(str2, str1, 20);strncat(str3, str1, 5);printf("%s\n", str2);printf("%s\n", str3);return 0;
}

在這里插入圖片描述

9. strncmp

int strncmp ( const char * str1, const char * str2, size_t num );
  • 函數參數
    • 與strcmp不同的,num代表比較前num個字符數。
  • 如果待比較的字符串長度比num小,則整個字符串參與比較。
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world123";const char* str2 = "hello world456";printf("%d\n", strncmp(str1, str2, 5));printf("%d\n", strncmp(str1, str2, 20));return 0;
}

在這里插入圖片描述

10. strstr

const char * strstr ( const char * str1, const char * str2 );char * strstr (       char * str1, const char * str2 );
  • 返回指向str1字符串中第一次出現str2字符串的指針。
  • 如果str2不是str1的一部分,則返回NULL。
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world";const char* str2 = "world";char* p = strstr(str1, str2);printf("%p\n%s\n", p, p);return 0;
}

在這里插入圖片描述

11. strtok

char * strtok ( char * str, const char * delimiters );
  • 函數參數:

    • str:需要處理的目標字符串。
    • delimiters:字符分隔符合集。
  • 遍歷str字符串,如果碰到delimiters中的字符,就將那個字符改成\0然后返回開始尋找的位置的指針。

  • 如果傳入str指針傳入NULL,則strtok將從上一個被修改成\0的字符的后一個位置開始尋找。

  • 如果沒有找到,則返回NULL。

#include <stdio.h>
#include <string.h>int main()
{char str1[] = "192.168.0.0";char* p = strtok(str1, ".");while (p){printf("%s\n", p);p = strtok(NULL, ".");}return 0;
}

在這里插入圖片描述

12. strerror

char * strerror ( int errnum );
  • 函數參數:

    • errnum:代表錯誤碼,當程序異常退出時,會返回一個錯誤碼。
  • 將錯誤碼傳入strerror函數,就可以獲取錯誤碼對應的描述信息,判斷出現了什么錯誤。

打印0~10號錯誤碼對應的錯誤信息:

#include <stdio.h>
#include <string.h>int main()
{for (int i = 0; i <= 10; i++)printf("error code %d : %s\n", i, strerror(i));return 0;
}

在這里插入圖片描述

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

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

相關文章

CGAL邊折疊edge_collapse的問題

使用edge_collapse對一個模型簡化&#xff0c;之后回收垃圾&#xff0c;collect_garbage 處理之前的頂點和三角形數量&#xff1a; number_of_vertices: 955730 number_of_faces: 1903410 num_vertices: 955730 num_faces: 1903410 處理之后的頂點和三角形數量&#xff1a;…

用c語言實現——順序隊列支持用戶輸入交互、入隊、出隊、查找、遍歷、計算隊列長度等功能。確定判斷判滿的方法為:犧牲一個存儲單元方式

一、知識介紹 1.基本原理 在順序隊列中&#xff0c;我們使用一個固定大小的數組來存儲隊列中的元素&#xff0c;并使用兩個指針&#xff08;front 和 rear&#xff09;來分別表示隊頭和隊尾的位置。 隊列為空的條件&#xff1a;front rear 隊列滿的條件&#xff1a;rear 1…

JVM 系列:JVM 內存結構深度解析

你點贊了嗎&#xff1f;你關注了嗎&#xff1f;每天分享干貨好文。 高并發解決方案與架構設計。 海量數據存儲和性能優化。 通用框架/組件設計與封裝。 如何設計合適的技術架構&#xff1f; 如何成功轉型架構設計與技術管理&#xff1f; 在競爭激烈的大環境下&#xff0c…

手機上的APN是什么,該怎么設置

網上說改個APN就可以讓網速快幾倍&#xff0c;那到底APN是個什么東西&#xff0c;真的能讓網速快幾倍嗎&#xff1f; APN的作用 網絡連接基礎&#xff1a;APN&#xff08;接入點名稱&#xff09;是手機連接移動網絡的“橋梁”&#xff0c;負責識別運營商網絡類型&#xff08;…

微服務治理與可觀測性

服務注冊與發現 核心功能 服務實例動態變化&#xff1a;實例可能因擴縮容、故障或遷移導致IP變動。服務依賴解耦&#xff1a;調用方無需硬編碼服務地址&#xff0c;降低耦合度。負載均衡&#xff1a;自動選擇健康實例&#xff0c;提升系統可用性。 核心組件 服務注冊中心&am…

嵌入式linux系統中內存管理的方法與實現

第一:linux內核管理詳解圖形 第二:Linux內存管理詳細分析 深入剖析Linux內核內存管理 作為嵌入式系統開發者,理解Linux內核的內存管理對于開發高效、穩定的系統至關重要。在這篇文章中,我們將詳細解析Linux內核如何劃分物理內存和虛擬內存,頁表、MMU(內存管理單元)與TL…

【dataframe顯示不全問題】打開一個行列超多的excel轉成df之后行列顯示不全

出現問題如下圖&#xff1a; 解決方案&#xff5e; display.width解決列顯示不全 pd.set_option(display.max_columns,1000) pd.set_option(display.width, 1000) pd.set_option(display.max_colwidth,1000) pd.set_option(display.max_rows,1000)

Linux——Shell編程之正則表達式與文本處理器(筆記)

目錄 基礎正則表達式 1:基礎正則表達式示例 &#xff08;4&#xff09;查找任意一個字符“.”與重新字符“*” &#xff08;5&#xff09;查找連續字符范圍“{ }” 文本處理器 一、sed工具 二、awk工具 &#xff08;1&#xff09;按行輸出文本 &#xff08;2&#xff0…

OpenHarmony系統-源碼下載,環境搭建,編譯,燒錄,調試

獲取源碼 以OpenHarmony5.0.3為例 repo init -u https://gitee.com/openharmony/manifest -b OpenHarmony-5.0.3-Release --no-repo-verify repo sync -c repo forall -c git lfs pull搭建環境 安裝必要的工具和命令 apt-get install -y apt-utils binutils bison flex bc …

Vue3 本地打包啟動白屏解決思路!! !

“為什么我訪問 http://127.0.0.1:5501/index.html 白屏&#xff0c;刪了 index.html 再訪問 / 就又活過來了&#xff1f;” —— 你的項目與 SPA 路由的“宮斗大戲” 一、問題復現 場景 本地通過 VSCode Live Server&#xff08;或其他靜態服務器&#xff09;啟動了打包后的 V…

數字人(2):數字人技術全景透視(2025演進版)

隨著人工智能技術的迅猛發展,數字人技術發展也是一日千里。站在當下,著眼未來,我們一起在回眸透視過去的基礎上,一起共同眺望數字人技術的未來。 一、數字人技術體系重構 我們可以用三維定義對數字人技術進行框架重構 維度 技術內涵 典型特征 物理層 人體數字化建模技術 …

小剛說C語言刷題——1035 判斷成績等級

1.題目描述 輸入某學生成績&#xff0c;如果 86分以上(包括 86分&#xff09;則輸出 VERY GOOD &#xff0c;如果在 60到 85之間的則輸出 GOOD (包括 60和 85)&#xff0c;小于 60 的則輸出 BAD。 輸入 輸入只有一行&#xff0c;包括 1個整數。 輸出 輸出只有一行&#xf…

React-在使用map循環數組渲染列表時須指定唯一且穩定值的key

在渲染列表的時候&#xff0c;我們須給組件或者元素分配一個唯一值的key, key是一個特殊的屬性&#xff0c;不會最終加在元素上面&#xff0c;也無法通過props.key來獲取&#xff0c;僅在react內部使用。react中的key本質是服務于diff算法, 它的默認值是null, 在diff算法過程中…

Zookeeper的通知機制是什么?

大家好&#xff0c;我是鋒哥。今天分享關于【Zookeeper的通知機制是什么&#xff1f;】面試題。希望對大家有幫助&#xff1b; Zookeeper的通知機制是什么&#xff1f; 1000道 互聯網大廠Java工程師 精選面試題-Java資源分享網 Zookeeper 的通知機制是其核心特性之一&#xf…

【LangChain實戰】構建下一代智能問答系統:從RAG架構到生產級優化

打破傳統問答系統的次元壁 當ChatGPT在2022年掀起AI革命時&#xff0c;開發者們很快發現一個殘酷現實&#xff1a;通用大模型在專業領域的表現如同拿著地圖的盲人&#xff0c;既無法理解企業私有數據&#xff0c;也無法保證事實準確性。這催生了RAG&#xff08;檢索增強生成&a…

UDS中功能尋址可以請求多幀數據嘛?當ECU響應首幀后,診斷儀是通過物理尋址發送流控幀嘛?

文章目錄 1. 前言??1.1 功能尋址是否支持請求多幀數據?1.2 ECU發送首幀(FF)后,診斷儀如何發送流控幀(FC)?1.3 協議依據(ISO 14229-1)1.4 實際應用注意事項總結1. 前言?? 在UDS(Unified Diagnostic Services)協議中,功能尋址與物理尋址的使用規則以及多幀數據傳…

PHP異常處理__Throwable

在 PHP 里&#xff0c;Throwable 是一個極為關鍵的接口&#xff0c;自 PHP 7 起被引入。它為錯誤和異常處理構建了一個統一的框架。下面會詳細介紹 Throwable 的相關內容。 1. 基本概念 Throwable 是 Exception 和 Error 的父接口。在 PHP 7 之前&#xff0c;異常&#xff08…

無需訓練的具身導航探索!TRAVEL:零樣本視覺語言導航中的檢索與對齊

作者&#xff1a; Navid Rajabi, Jana Kosecka 單位&#xff1a;喬治梅森大學計算機科學系 論文標題&#xff1a;TRAVEL: Training-Free Retrieval and Alignment for Vision-and-Language Navigation 論文鏈接&#xff1a;https://arxiv.org/pdf/2502.07306 主要貢獻 提出…

Vue3+Vite+TypeScript+Element Plus開發-22.客制Table組件

系列文檔目錄 Vue3ViteTypeScript安裝 Element Plus安裝與配置 主頁設計與router配置 靜態菜單設計 Pinia引入 Header響應式菜單縮展 Mockjs引用與Axios封裝 登錄設計 登錄成功跳轉主頁 多用戶動態加載菜單 Pinia持久化 動態路由 -動態增加路由 動態路由-動態刪除…

Java讀取JSON文件并將其中元素轉為JSON對象輸出

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄 Java讀取JSON文件并將其中元素轉為JSON對象輸…