C語言字符串相關函數

C語言筆記

內容提要

  • 數組

    • 字符串基本操作

    • 字符串相關函數

  • 綜合案例:學生成績管理系統

數組

字符串基本操作

在用格式化說明符%s進行輸入輸出時,其輸入輸出項均為數組名。但在輸入時,相鄰兩個

字符串之間要用空格分隔,系統將自動在字符串后加\0 。在輸出時,遇到結束符\0

為輸出結束標志。

對于字符串的操作,我們需要使用到一些系統提供的API函數。

字符串輸入
scanf
語法:
scanf("%s",數組名)

注意:采用scanf進行字符串輸入,要求字符串中不能有空格,否則字符串遇到空格就結束

案例:

#include <stdio.h>int main(int argc,char *argv[]){// 創建一個char數組,用來存儲姓名char name[20];printf("請輸入您的名字:\n");scanf("%s", name); // 用字符數組接收一個控制臺輸入的字符串常量printf("您的姓名是%s\n", name);return 0;}

注意:采用scanf進行字符串輸入,要求字符串中不能有空格,否則字符串遇到空格就會結束

fgest

語法:

fgets(數組名,數組容量,stdin);

功能

從鍵盤錄入一個字符串常量到字符數組,返回字符數組的地址(首地址,默認返回的

地址,一般用12位16進制數表示)

說明:

采用fgets進行字符串輸入,可獲取所有輸入的字符串,包含\n,在實際的字符串處理

時,我們可能需要手動處理\n

案例:

#include <stdio.h>int main(int argc,char *argv[]){// 創建一個字符數組,用來存儲姓名char name[20]; // 只是創建數組,必須指定容量;如果初始化,可以省略容量。// 計算數組容量int len = sizeof(name) / sizeof(name[0]);printf("請輸入您的姓名:\n");fgets(name, len, stdin);printf("您的姓名是%s\n", name);return 0;}

注意

①如果輸入的字符串不包括空格和換行,可以用scanf。

②如果輸入的字符串包括空格和換行,可以用fgest。

gets 危險的【C11移出】

語法:

gets(數組名);

功能:

從鍵盤錄入一個字符串常量到字符數組,返回字符數組的地址(首地址,默認返回的

地址,一般用12位16進制數表示)

說明:

采用gets進行字符串輸入,可獲取所有輸入的字符串,包含 \n ,在實際的字符串處

理時,我們可能需要處理 \n

案例:

#include <stdio.h>int main(int argc,char *argv[]){// 創建一個字符數組,用來存儲姓名char name[20]; // 只是創建數組,必須指定容量;如果初始化,可以省略容量。// 計算數組容量int len = sizeof(name) / sizeof(name[0]);printf("請輸入您的姓名:\n");gets(name);printf("您的姓名是%s\n", name);return 0;}
字符串輸出
printf

語法

printf("%s",數組名);

案例:

#include <stdio.h>int main(int argc,char *argv[]){// 創建一個字符數組,用來存儲姓名char name[20]; // 只是創建數組,必須指定容量;如果初始化,可以省略容量。// 計算數組容量int len = sizeof(name) / sizeof(name[0]);printf("請輸入您的姓名:\n");fgets(name, len, stdin);printf("您的姓名是%s\n", name);.// %s支持字符串常量,也支持字符數組,都是以字符串形式輸出return 0;}
fputs

語法:

fputs(數組名,stdout);

功能:輸出一個字符串

說明:字符串可以包括轉義字符(\開頭的字符)

案例:

#include <stdio.h>int main(int argc,char *argv[]){char arr[] = "hi yifanjiao\neat!\n";// 第1種輸出printf("%s", arr);// 第2種輸出fputs(arr, stdout);return 0;}

puts 危險的【C11移出】

語法:

puts(數組名稱);

功能:輸出一個字符串

說明:字符串可以包含轉義字符

案例:

#include <stdio.h>int main(int argc,char *argv[]){char arr[] = "hi yifanjiao\neat!\n";// 第1種輸出printf("%s", arr);// 第2種輸出puts(arr);return 0;}

字符串相關函數

字符串拼接

語法

strcat(字符數組,需要拼接的字符串或者字符數組或者字符指針);

解釋

①這里的字符串,可以是字符串常量,也可以是字符數組或者字符指針,參數1必須是字符數組。

②這里需要將字符串2拼接到字符串1,所以需要字符串1有足夠大的空間去容納字符串2。

引入

#include <string.h>

案例

  • 需求:將兩個字符串拼接為一個字符串

  • 分析:

  • 代碼:

#include <stdio.h>// 使用字符串相關函數需要引入必要的頭文件#include <string.h>int main(int argc,char *argv[]){// 創建一個字符數組,用來接收控制臺輸入char name[20];printf("請輸入您的名字:\n");// 通過控制臺輸入字符串(支持空格)fgets(name, sizeof(name) / sizeof(name[0]), stdin);// 輸出拼接 strcat返回拼接后的字符串fputs(strcat(name, "你好!"), stdout);printf("\n");// char str[50];// fputs(strcat(str, strcat(name, "你好!")), stdout);return 0;}

注意:

參數1 必須是字符數組,長度必須足夠大,以便于能夠容納被鏈接的字符串。

② 連接后系統將自動取消參數1 后面的結束符 \0

參數2 可以是字符數組名,也可以是指針,也可以是字符串常量,如:strcat(s1,"def"); strcat(s1,s2);

字符串拷貝

語法

strcpy(數組名,字符串);

解釋:簡單來說,類似于將一個字符串賦值給一個字符數組。這個函數一般用來做賦值處理。

引入:

#include <string.h>

說明:這個函數適合給字符串賦值

char str[20] = "**培"; // 正確,字符數組的初始化,字符串初始化char str[20] = "**培"; str = "*佳"; // 錯誤,不能對數組進行賦值char str[20] = "**凡"; strcpy(str, "**林");// 正確,利用函數實現類似賦值的操作

注意: strcat和strcpy的區別:

  • strcat: 凡 + 鴻 → 鴻 (追加)

  • strcpy: 凡 + 鴻 → **鴻 (覆蓋)

案例

#include <stdio.h>#include <string.h>int main(int argc,char *argv[]){// 需求:對數組賦值char name[50] = "hello";printf("打印初始化后的數組:%s\n", name);// 對一個數組賦:// name = "**鴻"; // 數組一旦創建,就無法改變,所以不能對數組進行賦值// 通過 strcpy(字符數組,字符數組/字符常量/字符指針)實現給數組賦值strcpy(name, "my");// my | mylloprintf("打印重新賦值后的數組:%s\n", name);return 0;}
字符串比較

語法

strcmp(字符串1,字符串2);

注意:這里的字符可以是字符串常量、字符數組、字符指針。

引入

#include <string.h>

功能:如果是英文,比較兩個字符串對應位置字符ASCII的大小

返回值

  • 如果字符串1 等于 字符串2,返回0

  • 如果字符串1 大于 字符串2,返回正數(>0)

  • 如果字符串1 小于 字符串2,返回負數(<0)

說明

① 執行這個函數時,自左向右逐個比較對應字符的ASCII的值,直到發現了不同字符或字

符串結束符\0為止

② 對字符串不能用數值型比較符。比如:"abc" == "abc",這種比較是錯誤的。

③ 字符串1與字符串2可以是字符數組、字符指針、字符串常量。

案例

  • 需求:通過控制臺輸入用戶名和密碼,并進行校驗

  • 代碼:

#include <stdio.h>#include <string.h>int main(int argc,char *argv[]){// 用戶登陸案例// 創建兩個變量,用來存儲用戶名和密碼char username[20], password[8];printf("---------用戶登錄--------\n");printf("請輸入您的用戶名:\n");scanf("%s",username);// 數組名本身就是一個地址(首元素的首地址)printf("請輸入您的密碼:\n");scanf("%s",password);// 校驗if (!strcmp(username,"admin") && !strcmp(password,"123456"))// 相等:strcmp(..) == 0printf("登錄成功!\n");elseprintf("用戶名或者密碼錯誤!\n");return 0;}
字符串長度

語法

strlen(字符串);

引用:

#include <string.h>

注意:返回字符串中包括的字符的實際個數。遇到\0結束,不包括\0,如果數組中不存在\0就以數組的實際長度作為字符串長度

案例

  • 需求:字符串長度案例

  • 代碼:

#include <stdio.h>#include <string.h>int main(int argc,char *argv[]){// 測試數據1char s1[] = {'h','i','\0','h','i','\0'};printf("數組長度:%lu\n字符串長度:%lu\n",sizeof(s1)/sizeof(s1[0]), strlen(s1));// 數組長度:6,字符串長度:2// 測試數據2char s2[] = "hi\0hi\0";// 使用雙引號包裹的內容稱之為 字符串常量,字符串常量默認會有一個結尾的\0printf("數組長度:%lu\n字符串長度:%lu\n",sizeof(s2)/sizeof(s2[0]), strlen(s2));// 數組長度:7,字符串長度:2// 測試數據3char s3[] = {'h','e','l','l','o'};// strlen()判斷一個字符串的長度,優先判斷是否存在\0,如果不存在,就返回數組實際長度,因編譯器原因,處理機制也有所不同。printf("數組長度:%lu\n字符串長度:%lu\n",sizeof(s3)/sizeof(s3[0]), strlen(s3));// 數組長度:5,字符串長度: 5,這種寫法不安全,不同編譯器編譯結果不同// 測試數據4char s4[] = "hello";printf("數組長度:%lu\n字符串長度:%lu\n",sizeof(s4)/sizeof(s4[0]), strlen(s4));// 數組長度:6,字符串長度:5return 0;}

案例

  • 需求:輸入一行字符,統計其中有多少個單詞,單詞之間使用空格隔開。舉例:ILOVE YOU

分析:采用通過空格統計單詞的方法。具體是:

① 用連續若干個空格算一個、一行開頭的空格不計的方法決定單詞數目;

② 從第一個字符開始逐個檢查字符串中的每一個字符。若查到某一字符非空格,而其前面的字符是空格,則表示新單詞開始,讓計數變量num++。否則,當前字符非空格,前面字符也非空格,則非新單詞,num不變;

③ 用變量word=0或1來表示前面字符是空格或不是空格。則:

  • 代碼:

#include <stdio.h>#include <ctype.h>int main(int argc,char *argv[]){// 創建一個數組,用來接收控制臺錄入的字符串char string[100];// 創建2個變量,word:統計字符是否是空字符(空字符:0,非空字符:1),num:用來統計單詞個數int num = 0, word = 0;// 創建一個變量,用來存儲遍歷到的字符char c;// 通過控制臺錄入字符串printf("請輸入一句話:\n");fgets(string, sizeof(string)/sizeof(string[0]), stdin);// 遍歷for (int i = 0; (c = string[i])!='\0'; i++){if (isspace(c)) // 判斷一個字符是否是空格,等價于 if (c == ''){// 如果是空格,標記word = 0;}else{// 如果上一個字符是空格,就需要統計單詞if (!word) // 等價于 word == 0{// 標記word為非空格word = 1;// 統計單詞個數num ++;}}}printf("%s\n中有%d個單詞!\n", string, num);return 0;}

案例

有三個字符串,要求找出其中最大者。

分析:設計一個二維字符數組str3,即3行20列。

① 可把str[0]、str[1]、str[2]看作3個一維字符數組,各有20個元素;

② 用gets函數分別輸入3個字符串到str[0]、str[1]、str[2]中 ;

③ 用字符串函數對str[0]、str[1]、str[2]進行比較,得到最大者。

#include <stdio.h>#include <string.h>int main(int argc,char *argv[]){// 創建一個數組,用來存儲最大的字符串char max[50];// 創建一個數組,用來存儲3個用來參與比較的字符串char str[3][50]/* = {"apple","orange","egg"}*/;int i;// 通過循環控制臺輸入printf("請輸入3個測試字符串:\n");for (i = 0; i < 3; i++){fgets(str[i],50,stdin);}// 比較if (strcmp(str[0],str[1]) > 0) strcpy(max, str[0]);else strcpy(max,str[1]);if (strcmp(str[2],max) > 0) strcpy(max,str[2]);printf("\n三個字符串中最大的字符串是%s\n!", max);return 0;}

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

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

相關文章

從零開始:用Python庫輕松搭建智能AI代理

為什么要關注AI代理&#xff1f; “Agentic AI”&#xff08;智能代理&#xff09;正在悄然改變我們的工作方式。想象一下&#xff0c;一個AI助手不僅能幫你查航班、訂機票&#xff0c;還能自動安排行程、發郵件、生成日報——就像一個效率極高的“虛擬助理”團隊。 對于測試工…

如何防止GitHub上的敏感信息被泄漏?

如大家所了解的&#xff0c;隨著GitHub的用戶越來越多&#xff0c;GitHub上的敏感信息被泄漏的問題也越來越嚴重。那么如何做&#xff0c;才能防止此類事情發生呢&#xff1f;這值得我們探討。移除并刪除敏感信息當我們發現了歷史 commit 中包含敏感信息后&#xff0c;第一步便…

船舶機械零件的深孔工藝及檢測方法 —— 激光頻率梳 3D 輪廓檢測

引言船舶機械零件中的深孔結構&#xff08;深徑比&#xff1e;15:1&#xff09;直接影響動力系統可靠性&#xff0c;如柴油機缸體深孔、推進軸系潤滑油孔等。此類深孔具有孔徑大&#xff08;φ10 - 50mm&#xff09;、深度深&#xff08;500 - 2000mm&#xff09;、表面質量要求…

論文Review Lidar 3DGS Splat-LOAM: Gaussian Splatting LiDAR Odometry and Mapping

基本信息 題目&#xff1a;Splat-LOAM: Gaussian Splatting LiDAR Odometry and Mapping 來源&#xff1a;ICCV 2025 學校&#xff1a;Sapienza University of Rome 是否開源&#xff1a;https://github.com/rvp-group/Splat-LOAM 摘要&#xff1a;純激光3DGS&#xff01;…

MYSQL:數據庫約束

文章目錄MYSQL&#xff1a;數據庫約束&#xff1a;為你的數據上把“安全鎖”1. 約束的類型概覽2. NOT NULL 非空約束3. DEFAULT 默認值約束4. UNIQUE 唯一約束5. PRIMARY KEY 主鍵約束5.1 自增主鍵 AUTO_INCREMENT5.3 復合主鍵6. FOREIGN KEY 外鍵約束7. CHECK 約束總結MYSQL&a…

網絡數據編碼技術及其應用場景的全面解析

網絡數據編碼技術全景圖?編碼類型??編碼原理??適用層??典型應用場景??優勢??缺陷??曼徹斯特編碼?電平跳變代表數據位&#xff08;高→低1&#xff0c;低→高0&#xff09;物理層10/100M以太網、RFID標簽自同步時鐘帶寬利用率僅50%?4B/5B編碼?4比特映射為5比特物…

RustDesk自建服務器完整部署指南:從零開始到成功連接。成功解決rustdesk報錯:未就緒,請檢查網絡連接

最近需要用到遠程工具解決用戶問題&#xff0c;todesk總是提示付費&#xff0c;干脆自己使用開源的。當然凡事都有代價。 話費了一個工作日的時間終于搞定了。 本文將詳細介紹如何從零開始部署RustDesk自建服務器&#xff0c;實現完全自主可控的遠程桌面解決方案。 踩坑 參考…

datasophon安裝doris問題排除記錄

datasophon安裝doris搞了好久才成功&#xff0c;特別記錄一下。 多災多難的安裝過程&#xff1a;FE安裝 首先&#xff0c;配置界面&#xff0c;要注意兩個參數一定要改成正確的網段&#xff0c;否則會被識別成127.0.0.1注意&#xff1a;兩個priority_networks 參數必須要改成你…

suricata新增Mysql告警規則處理

suricata新增Mysql告警規則處理協議解析后續處理內容新增規則規則解析關鍵字新增Setup用于初始化檢測項Free用于資源釋放AppLayerTxMatch用于協議解析完成后的規則檢測針對pcap文件進行檢測總結協議解析后續處理內容 經過Mysql協議解析處理流程 介紹&#xff0c;我們在suricat…

使用位運算優化 Vue.js 應用:高效狀態管理技巧

在 Vue.js 開發中&#xff0c;位運算&#xff08;Bitwise Operations&#xff09;是一種高效的工具&#xff0c;尤其適用于需要管理大量布爾狀態或優化性能的場景。位運算通過操作二進制位來實現狀態的存儲和檢查&#xff0c;相比傳統的數組或對象操作&#xff0c;內存占用更低…

【Java SE】Clonable接口和深拷貝

目錄 一.Clonable接口 實現步驟&#xff1a; 完整代碼&#xff1a; 二.深拷貝 實現步驟&#xff1a; 完整代碼&#xff1a; 淺拷貝與深拷貝的對比 使用場景建議 完 淺拷貝&#xff08;Shallow Copy&#xff09;和深拷貝&#xff08;Deep Copy&#xff09;是對象復制的兩…

accelerate 在Pycham中執行的設置方法

背景 使用 accelerate 進行分布式代碼訓練時&#xff0c;需要在pycharm中進行調試&#xff0c;此時需要在pycharm中運行。 終端執行命令 # *[Specify the config file path and the GPU devices to use] export CUDA_VISIBLE_DEVICES0# *[Specify the config file path] expo…

探索量子計算與法律理論的交叉領域

文章目錄 前言 一、引言 二、內容 (一)知識產權 (二)隱私與安全 (三)責任認定 (四)證據與證明 (五)法律推理與決策 三、結論 總結 前言 隨著量子計算技術的突破性發展,其引發的法律范式重構問題日益凸顯。烏茲別克斯坦學者伊索姆別克?阿卜迪哈基莫夫于2024年在《量…

js迭代器

文章目錄前言實現原理&#xff1a;調用迭代器自制迭代器前言 迭代器是 JSt 中一種特殊的對象&#xff0c;它提供了一種統一的、通用的方式遍歷個各種不同類型的數據結構。 可以遍歷的數據結構包括&#xff1a;數組、字符串、Set、Map 等可迭代對象。我們也可以自定義實現迭代器…

chainlink VRF中文教程(含mock),解決error: Arithmetic Underflow in createSubscription

?我使用的版本&#xff1a;chainlink-brownie-contracts version:1.3.0?1. Import 相關包 ,,, import {VRFConsumerBaseV2Plus} from "chainlink/contracts/src/v0.8/vrf/dev/VRFConsumerBaseV2PLUS.sol"; import {VRFV2PlusClient} from "chainlink/contract…

非線性優化框架CasADi工具箱求解最優控制問題OCP

CasADi是一個開源的Python/MATLAB庫&#xff0c;主要用于數值優化&#xff0c;特別是最優控制問題。它提供了一個易于使用的符號框架&#xff0c;用于處理和生成表達式&#xff0c;以及高效地生成導數信息。 https://web.casadi.org/get/https://web.casadi.org/get/ 所有OCP…

Type-C接口臺式顯示器:LDR6021引領新潮流

Type-C單口便攜顯示器LDR6021是市場上一種新興的顯示設備&#xff0c;以下是對其的詳細介紹一、主要特點 便攜性:LDR6021采用了Type-C接口作為數據傳輸和供電接口&#xff0c;這種設計使得它能夠與各種支持Type-C接口的設備無縫連接&#xff0c;如筆記本電腦、智能手機、平板電…

在翻譯語義相似度和會議摘要相似度評估任務中 ,分類任務 回歸任務 生成任務區別

在翻譯語義相似度&#xff08;Translation Semantic Similarity&#xff09;和會議摘要相似度&#xff08;Meeting Summary Similarity&#xff09;等任務中&#xff0c;通常會根據任務的目標和輸出形式&#xff0c;將其劃分為三類常見的任務類型&#xff1a;1. 分類任務定義&a…

UGUI 性能優化系列:第二篇——Canvas 與 UI 元素管理

UGUI 性能優化系列&#xff1a;第一篇——基礎優化與資源管理 UGUI 性能優化系列&#xff1a;第二篇——Canvas 與 UI 元素管理 UGUI 性能優化系列&#xff1a;第三篇——渲染與像素填充率優化 UGUI 性能優化系列&#xff1a;第四篇——高級優化與注意事項 在 UGUI 性能優化…

企業開發轉型 | 前端AI化數字化自動化現狀

文章目錄前端AI化數字化自動化發展現狀引言調研背景與目的調研范圍與方法前端AI化技術現狀與工具生態主流AI工具分類與能力矩陣工具能力對比分析關鍵能力指標深度解析大模型技術成熟度評估前端AI化核心應用場景與人力優化路徑代碼生成與自動化開發設計到代碼全鏈路自動化自動化…