字符串與相應函數(上)

字符串處理函數分類

  • 求字符串長度:strlen
  • 長度不受限制的字符串函數:strcpy,strcat,strcmp
  • 長度受限制的字符串函數:strncpy,strncat,strncmp
  • 字符串查找:strstr,strtok
  • 錯誤信息報告:strerror
  • 字符操作,內存操作函數:memcpy,memmove,memset,memcmp

strlen

這是一個用于計算字符串長度的函數,它從字符串的起始位置開始計數,直到遇到字符串結束符\0為止,然后返回計數器的值。這個函數不包括結束符\0在內

strlen函數的特點

  • 字符串以‘\0’作為結束標志,strlen函數返回的是字符串中‘\0’前面出現的字符個數

strlen函數的模擬實現

 #define  _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include <assert.h>
#include<string.h>int my_strlen1(const char* str)
{assert(str != NULL);int count = 0;while (*str != '\0'){count++;str++;}return count;
}//遞歸
int my_strlen2(const char* str)
{assert(str != NULL);if (*str != '\0')return 1 + my_strlen2(str + 1);elsereturn 0;
}//指針-指針
int my_strlen3(const char* str)
{const char* start = str;while (*str){str++;}return str - start;
}int main()
{char arr[] = "abcdef";int ret1 = my_strlen1(arr);int ret2 = my_strlen2(arr);int ret3 = my_strlen3(arr);printf("%d\n", ret1);printf("%d\n", ret2);printf("%d\n", ret3);return 0;
}

strlen函數的使用

#define  _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>int main()
{char arr[] = "bdeuwbfuycgbei";int ret = strlen(arr);printf("%d", ret);return 0;
}

輸出結果:

strcpy

這個函數用于將一個字符串復制到另一個字符串中,直到遇到源字符串的結束符\0為止。如果目標字符串已經有內容,會被源字符串覆蓋

strcpy函數的特點

  • 源字符串必須以 '\0' 結束
  • 會將源字符串中的 '\0' 拷貝到目標空間
  • 目標空間必須足夠大,以確保能存放源字符串
  • 目標空間必須可變

strcpy函數的模擬實現

#define  _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>
#include<assert.h>char* my_strcpy(char* din, char* sou)
{char* ret = din;assert(din && sou);while ( *din++=*sou++ ){;}return ret;
}int main()
{char str1[20] = "hello ";char str2[] = "hehe";my_strcpy(str2, str1);printf("%s\n", str2);return 0;
}

輸出結果

strcpy函數的使用

#define  _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>int main()
{char arr1[] = "hello";char arr2[] = "xixi";strcpy(arr1, arr2);printf("%s", arr1);return 0;
}

strcat

這個函數用于將一個字符串追加到另一個字符串的末尾,形成一個新的字符串。它會將源字符串的內容添加到目標字符串的后面,直到遇到源字符串的結束符\0為止

strcat函數的特點

  • 源字符串必須以 '\0' 結束。
  • 目標空間必須有足夠的大,能容納下源字符串的內容。
  • 目標空間必須可修改

strcat函數的模擬實現

#define  _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>
#include<assert.h>char* my_strcat(char* din, char* sou)
{assert(din && sou);char* ret = din;while (*din){din++;}while (*din++ = *sou++){;}return ret;
}int main()
{char arr1[] = "hello ";char arr2[] = "world";my_strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}

strcat函數的使用

#define  _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <string.h>int main ()
{char key[] = "apple";char buffer[80];do {printf ("Guess my favorite fruit? ");fflush (stdout);scanf ("%79s",buffer);} while (strcmp (key,buffer) != 0);puts ("Correct answer!");return 0;
}#include<stdio.h>
#include<string.h>int main()
{char str[80];strcpy(str, "these ");strcat(str, "strings ");strcat(str, "are ");strcat(str, "concatenated.");puts(str);return 0;
}

輸出結果:

strcmp

這個函數用于比較兩個字符串。如果兩個字符串相等,它返回0;如果第一個字符串小于第二個字符串,它返回負數;如果第一個字符串大于第二個字符串,它返回正數

strcmp函數的規定

strcmp函數的模擬實現

#define  _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>
#include<assert.h>int my_strcmp(const char* arr1, const char* arr2)
{assert(arr1 && arr2);while (*arr1 == *arr2){if (*arr1 == '\0')return 0;*arr1++;*arr2++;}return *arr1 - *arr2;
}int main()
{char arr1[] = "abc";char arr2[] = "abcde";int ret = my_strcmp(arr1, arr2);printf("%d\n", ret);return 0;
}

strcmp函數的使用

#define  _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <string.h>int main()
{char key[] = "apple";char buffer[80];do {printf("Guess my favorite fruit? ");fflush(stdout);scanf("%79s", buffer);} while (strcmp(key, buffer) != 0);puts("Correct answer!");return 0;
}

輸出結果:

strcpy,strcat,strcmp與strncpy,strncat,strncmp的區別

長度限制方面

  • strcpystrcatstrcmp:屬于長度不受限制的字符串函數,以 '\0' 作為操作結束標志。例如 strcpy 會將源字符串一直拷貝到 '\0' 才停止,strcat 會將源字符串追加到目標字符串后直到源字符串的 '\0'strcmp 會比較兩個字符串直到遇到 '\0'。不過這也可能帶來問題,如 strcpy 在目的空間不夠時,由于拷貝到 '\0' 才停止,可能會導致越界訪問,使函數變得不安全
  • strncpystrncatstrncmp:屬于長度受限制的字符串函數,在函數調用時需要額外指定操作的字符數量,能避免因操作過長字符串而引發的安全問題
    ?

#define  _CRT_SECURE_NO_WARNINGS 1
/* strncpy example */
#include <stdio.h>
#include <string.h>int main()
{char str1[] = "To be or not to be";char str2[40];char str3[40];/* copy to sized buffer (overflow safe): */strncpy(str2, str1, sizeof(str2));/* partial copy (only 5 chars): */strncpy(str3, str2, 5);str3[5] = '\0';   /* null character manually added */puts(str1);puts(str2);puts(str3);return 0;
}

輸出結果:

其他兩個相似

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

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

相關文章

asm匯編源代碼之文件操作相關

提供7個子程序:   1. 關閉文件 FCLOSE   2. 打開文件 FOPEN   3. 文件大小 FSIZE   4. 讀文件 FREAD   5. 寫文件 FWRITE   6. 建立文件 FCREATE   7. 讀取或設置文件指針 FPOS 具體功能及參數描述如下 ; ---------------------------- FCLOSE PROC  FAR ; IN…

[Dify] 使用 Docker 本地部署 Dify 并集成 Ollama 模型的詳細指南

在 AI 應用快速發展的今天&#xff0c;開源項目如 Dify 正成為構建本地化 AI 應用的利器。通過 Dify&#xff0c;你可以輕松地集成不同的大語言模型&#xff08;LLM&#xff09;&#xff0c;如 Ollama&#xff0c;并快速創建可交互的 AI 應用。本篇文章將帶你一步步通過 Docker…

Spring Boot 測試詳解,包含maven引入依賴、測試業務層類、REST風格測試和Mock測試

Spring Boot 測試詳解 1. 測試依賴引入 Spring Boot 默認通過以下 Maven 依賴引入測試工具&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</s…

DevOps與功能安全:Perforce ALM通過ISO 26262合規認證,簡化安全關鍵系統開發流程

本文來源perforce.com&#xff0c;由Perforce中國授權合作伙伴、DevSecOps解決方案提供商-龍智翻譯整理。 近日&#xff0c;Perforce ALM&#xff08;原Helix ALM&#xff09;通過了國際權威認證機構 TV SD的ISO 26262功能安全流程認證&#xff01;該認證涵蓋Perforce ALM解決方…

Android11車載WiFi熱點默認名稱及密碼配置

一、背景 基于車廠信息安全要求,車載熱點默認名稱不能使用統一的名稱,以及默認密碼不能為簡單的1~9。 基于舊項目經驗,組裝工廠自動化測試及客戶整車組裝的時候均存在多臺設備同時打開,亦不太推薦使用統一的熱點名稱,連接無法區分。 二、需求 根據客戶的要求,默認名稱…

MacOs java環境配置+maven環境配置踩坑實錄

oracl官網下載jdk 1.8的安裝包 注意可能需要注冊&#xff01;&#xff01;&#xff01; 下載鏈接&#xff1a;下載地址點擊 注意晚上就不要下載了 報錯400 &#xff01;&#xff01;&#xff01; 1.點擊安裝嘛 2.配置環境變量 export JAVA_HOME/Library/Java/Java…

如何解讀 /proc/net/netstat

在刷了屏的川普&#xff0c;關稅&#xff0c;AI 大模型和 RDMA 之外的一股清流&#xff0c;來點實用的。 眾所周知 /proc/net/netstat 很難讀&#xff0c;且 netstat 并不是每個系統上都支持 -s&#xff0c;那么對齊該文件給出一個可讀的輸出就是一件高尚的事。可以用 column …

漢化進度100%

P3834 #include<bits/stdc.h> #define int long long #define 定義整型變量 int #define 這是一個常量 const #define 無返回值函數 void #define 這是一個循環條件在后面 for #define 定義結構體 struct #define 如果 if #define 否則 else #define 定義無返回值的 sig…

基于SpringBoot的動物救助中心系統(源碼+數據庫)

500基于SpringBoot的動物救助中心系統&#xff0c;本系統共分為2個角色&#xff1a;系統管理員、用戶&#xff0c;主要功能如下 【管理員】&#xff1a; 1. 登錄&#xff1a;管理員可以通過登錄系統來管理各種功能。 2. 用戶管理&#xff1a;管理員可以查看用戶列表&#xff0…

rockylinux 8 9 升級到指定版本

rockylinux 8 update 指定版本 rockylinux 歷史版 所有版本rockylinux 最新版 所有版本vault歷史版 pub最新版(https://dl.rockylinux.org)地址后面增加不同名稱 echo "delete repos" rm -rf /etc/yum.repos.d/*echo "new rockylinux repo" cat <<EO…

聚焦AI與大模型創新,紫光云如何引領云計算行業快速演進?

【全球云觀察 &#xff5c; 科技熱點關注】 隨著近年來AI與大模型的興起&#xff0c;云計算行業正在發生著一場大變局。 “在2025年春節期間&#xff0c;DeepSeek兩周火爆全球&#xff0c;如何進行私域部署成了企業關心的問題。”紫光云公司總裁王燕平強調指出&#xff0c;AI與…

React8+taro開發微信小程序,實現lottie動畫

安裝核心依賴 npm install lottie-miniprogram tarojs/plugin-html --save修改 Taro 配置 (config/index.js) const config {plugins: [tarojs/plugin-html,// 其他插件...],mini: {canvas: true,webpackChain(chain) {chain.merge({module: {rule: {lottie-loader: {test: …

有效壓縮 Hyper-v linux Centos 的虛擬磁盤 VHDX

參考&#xff1a; http://www.360doc.com/content/22/0505/16/67252277_1029878535.shtml VHDX 有個不好的問題就是&#xff0c;如果在里面存放過文件再刪除&#xff0c;那么已經使用過的空間不會壓縮&#xff0c;導致空間一直被占用。那么就需要想辦法壓縮空間。 還有一點&a…

【力扣hot100題】(089)最長有效括號

這題目真是越做越難了。 但其實只是思路很難想到&#xff0c;一旦會了方法就很好做。 但問題就在方法太難想了…… 思路還是只要遍歷一遍數組&#xff0c;維護動態規劃數組記錄截止至目前位置選取該元素的情況下有效括號的最大值。 光是知道這個還不夠&#xff0c;看了答案…

Ajax------免刷新地前后端交互

本文略帶PHP代碼需要在PHP環境下使用 介紹 AJAX (Asynchronous JavaScript and XML) 是一種創建快速動態網頁應用的開發技術&#xff0c;它允許網頁在不重新加載整個頁面的情況下&#xff0c;與服務器交換數據并更新部分網頁內容。例如&#xff0c;在我們做爬蟲的時候發現有些…

Android 中支持舊版 API 的方法(API 30)

Android 中最新依賴庫的版本支持 API 31 及以上版本&#xff0c;若要支持 API30&#xff0c;則對應的依賴庫的版本就需要使用舊版本。 可通過修改模塊級 build.gradle 文件來進行適配。 1、android 標簽的 targetSdk 和 compileSdk 版本號 根據實際目標設備的 android 版本來…

JDBC注入無外網(上):從HertzBeat聊聊SnakeYAML反序列化

上周日聯合Ar3h 師傅一起&#xff0c;在【代碼審計知識星球】里發布了一個Springboot的小挑戰&#xff1a;https://t.zsxq.com/tSBBZ&#xff0c;這個小挑戰的核心目標是在無法連接外網的情況下&#xff0c;如何利用PSQL JDBC注入漏洞。我會分兩篇文章來講講Java安全的不出網利…

QTreeWidget 手動設置選中項后不高亮的問題

當使用Qt編程QTreeWidget setCurrentItem() 方法設置 QTreeWidget 的當前項時&#xff0c;如果發現選中項顯示為灰色而不是高亮狀態&#xff0c;這通常是由以下幾個原因導致的&#xff1a; 方法1. 焦點問題 ? 確保 QTreeWidget 有焦點 ? 解決方案&#xff1a; cpp treeWidge…

javaSE學習(前端基礎知識)

文章目錄 前言一、HTML1、< th >、< tr > 和 < td >標簽&#xff1a;2、< button > 標簽&#xff1a;3、< input type"text" >&#xff1a;4、< br >&#xff1a; 二、CSS1、選擇器2、聲明塊3、常用屬性及值 三、JS1、Vue 實例對…

c# 數據結構 鏈表篇 有關單鏈表的一切

本人能力有限,本文僅作學習交流與參考,如有不足還請斧正 目錄 0.單鏈表好處 0.5.單鏈表分類 1.無虛擬頭節點情況 圖示: 代碼: 頭插/尾插 刪除 搜索 遍歷全部 測試代碼: 全部代碼 2.有尾指針情況 尾插 全部代碼 3.有虛擬頭節點情況 全部代碼 4.循環單鏈表 幾個…