模擬實現strncat、qsort、atoi

目錄

前言

一、模擬實現strncat

參數

代碼演示:

二、模擬實現qsort

參數

代碼演示:


前言

本文主要是對strncat,qsort,atoi的模擬實現


一、模擬實現strncat

? ? ? C 庫函數?char *strncat(char *dest, const char *src, size_t n)?把?src?所指向的字符串追加到?dest?所指向的字符串的結尾,直到?n?字符長度為止。

實現起來很容易,但要注意細節

# 關鍵點
- dest=NULL` 時不能復制**,因為無法寫入 `NULL` 指針。
- src=NULL` 時也不能復制**,因為無法讀取 `NULL` 指針。
- num=0` 時直接返回 `dest`**,因為不需要追加任何字符。
- 標準庫 `strncat` 的行為**:它不檢查 `dest` 或 `src` 是否為 `NULL`,直接解引用它們,所以調用者必須確保它們有效。但我們在模擬實現時,可以增加安全檢查,避免崩潰。

參數

  • dest?-- 指向目標數組,該數組包含了一個 C 字符串,且足夠容納追加后的字符串,包括額外的空字符。
  • src?-- 要追加的字符串。
  • n?-- 要追加的最大字符數。

代碼演示:

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include<windows.h>char* my_strncat(char* dest, const char* src, size_t num) {if ( dest==NULL||src == NULL||num==0) {return dest;}char* a = dest;while (*dest)dest++;while ((*dest++ = *src++) && num--); *dest = '\0';return a;
}int main() {char a[] = "jfskjfsj";char b[] = "shffhs";my_strncat(a, b, 3);puts(a);my_strncat(a ,b, 7);puts(a);char str1[20];char str2[20];strcpy(str1, "To be ");strcpy(str2, "or not to be");strncat(str1, str2, 6);puts(str1);system("pause");return 0;
}
#include <stdio.h>
#include <assert.h>char* my_strncat(char* dest, const char* src, size_t num) {if (dest == NULL) {  // 如果 dest 是 NULL,直接返回 NULLreturn NULL;}if (src == NULL || num == 0) {  // 如果 src 是 NULL 或 num=0,直接返回 destreturn dest;}char* a = dest;// 找到 dest 的末尾while (*dest) {dest++;}// 復制最多 num 個字符while (num-- && (*dest++ = *src++)) {// 空循環體}// 確保字符串以 '\0' 結尾*dest = '\0';return a;
}int main() {char a[20] = "hello";char b[] = "world";my_strncat(a, b, 3);  // a 變成 "hellowor"puts(a);// 測試 dest=NULL 的情況char* null_dest = NULL;my_strncat(null_dest, b, 3);  // 不會崩潰,直接返回 NULLputs(null_dest);// 測試 src=NULL 的情況my_strncat(a, NULL, 3);  // 不會崩潰,直接返回 aputs(a);return 0;
}

二、模擬實現qsort

? ?qsort?是 C 標準庫中提供的一個函數,用于對數組進行快速排序。它在?<stdlib.h>?頭文件中定義。qsort?使用的是快速排序算法(quicksort),這是一種高效的排序算法,平均時間復雜度為 O(n log n)。

C 庫函數?void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))?對數組進行排序。

參數

  • base: 指向待排序數組的第一個元素的指針。
  • nitems: 數組中的元素數量。
  • size: 數組中每個元素的大小(以字節為單位)。
  • compar: 比較函數的指針,該函數用于比較兩個元素。比較函數應當返回一個整數,表示比較結果:
    • 小于零:表示第一個元素小于第二個元素。
    • 等于零:表示兩個元素相等。
    • 大于零:表示第一個元素大于第二個元素。

代碼演示:

#include <stdio.h>
#include <string.h> // 交換兩個元素(逐字節交換)
void swap(void* a, void* b, size_t size) {char* pa = (char*)a;char* pb = (char*)b;for (size_t i = 0; i < size; i++) {char tmp = pa[i];pa[i] = pb[i];pb[i] = tmp;}
}// Hoare 分區法
int partition(void* base, int low, int high, size_t size, int (*compar)(const void*, const void*)) {char* arr = (char*)base;void* pivot = arr + high * size; // 選擇最后一個元素作為 pivotint i = low - 1;for (int j = low; j <= high - 1; j++) {if (compar(arr + j * size, pivot) <= 0) {i++;swap(arr + i * size, arr + j * size, size);}}swap(arr + (i + 1) * size, arr + high * size, size);return i + 1;
}// 遞歸快速排序
void quick_sort(void* base, int low, int high, size_t size, int (*compar)(const void*, const void*)) {if (low < high) {int pi = partition(base, low, high, size, compar);quick_sort(base, low, pi - 1, size, compar);quick_sort(base, pi + 1, high, size, compar);}
}// 模擬 qsort
void my_qsort(void* base, size_t num, size_t size, int (*compar)(const void*, const void*)) {if (base == NULL || num == 0 || size == 0 || compar == NULL) {return; // 無效參數直接返回}quick_sort(base, 0, num - 1, size, compar);
}// 比較函數(整型)
int cmp(const void* a, const void* b) {return *(int*)a - *(int*)b;
}int main() {int arr[] = {88,999,0, 5, 2, 8, 1, 3 };size_t n = sizeof(arr) / sizeof(arr[0]);my_qsort(arr, n, sizeof(int), cmp);for (size_t i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}

三、模擬實現atoi

? ? ? ? C 庫函數?int atoi(const char *str)?把參數?str?所指向的字符串轉換為一個整數(類型為 int 型)。

聲明

下面是 atoi() 函數的聲明。

int atoi(const char *str)

參數

  • str?-- 要轉換為整數的字符串。

代碼演示:
#include<stdio.h>
#include <ctype.h>
#include <limits.h>
#include<string.h>
int my_atoi(const char* str) {int flag = 1;long result = 0;  // 使用long來檢測溢出// 跳過前導空白字符while (isspace(*str))str++;// 處理可選符號if (*str == '+') {str++;}else if (*str == '-') {flag = -1;str++;}// 轉換數字部分while (isdigit(*str)) {result = result * 10 + (*str - '0');str++;// 檢查溢出if (flag == 1 && result > INT_MAX) {return INT_MAX;}else if (flag == -1 && -result < INT_MIN) {return INT_MIN;}}return (int)(flag * result);
}
int main() {char a[] = "123458899";int ret = my_atoi(a);printf("%d\n ", ret);int val;char str[20] = "98993489";val = my_atoi(str);printf("字符串值 = %s, 整型值 = %d\n", str, val);char str2[20] = "runoob.com";val = my_atoi(str2);printf("字符串值 = %s, 整型值 = %d\n", str2, val);return 0;
}


總結

關于本篇的內容就結束了,對你有幫助的可以點個贊

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

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

相關文章

Ubuntu 系統中修改 MySQL 的 sql_mode

在 Ubuntu 系統中修改 MySQL 的 sql_mode 需要編輯 MySQL 的配置文件并重啟服務。以下是詳細步驟&#xff1a; 步驟 1&#xff1a;定位 MySQL 配置文件 MySQL 配置文件通常位于以下路徑之一&#xff08;具體取決于安裝方式&#xff09;&#xff1a; /etc/mysql/my.cnf /etc/m…

進階算法 第一課:貪心

本文遵循 CC BY-NC-ND 4.0 協議&#xff0c;作者&#xff1a; U?ェ?*U \texttt{U?ェ?*U} U?ェ?*U&#xff0c;轉載請獲得作者授權。 歡迎大家來到進階算法第一課&#xff1a;貪心&#xff1b;我會分為以下幾點為大家講解貪心&#xff1a; 什么是貪心。貪心的性質與分類。…

AI領域:MCP 與 A2A 協議的關系

一、為何會出現MCP和A2A 協議是非常重要的東西&#xff0c;只有大家都遵循統一的協議&#xff0c;整體生態才好發展&#xff0c;正如有了HTML&#xff0c;互聯網才快速發展&#xff0c;有了OpenAPI&#xff0c; API才會快速發展。 Agent目前是發展最快的領域&#xff0c;從最初…

深度學習訓練中的顯存溢出問題分析與優化:以UNet圖像去噪為例

最近在訓練一個基于 Tiny-UNet 的圖像去噪模型時&#xff0c;我遇到了經典但棘手的錯誤&#xff1a; RuntimeError: CUDA out of memory。本文記錄了我如何從復現、分析&#xff0c;到逐步優化并成功解決該問題的全過程&#xff0c;希望對深度學習開發者有所借鑒。 訓練數據&am…

FramePack V2版 - 支持首尾幀生成,支持LoRA,支持批量,支持50系顯卡,一個強大的AI視頻生成軟件 本地一鍵整合包下載

FramePack 是斯坦福大學主導開發的視頻生成框架&#xff0c;是一種用于視頻生成的下一幀&#xff08;下一幀部分&#xff09;預測神經網絡結構&#xff0c;可以逐步生成視頻。FramePack 主要開發者之一&#xff0c;就是業內大名鼎鼎的張呂敏大佬&#xff0c;AI領域的“賽博佛祖…

STM32 HAL 通用定時器延時函數

使用通用定時器TIM3&#xff0c;實現ms、us延時。 delay.c #include "delay.h" #include "stm32f1xx_hal.h"TIM_HandleTypeDef htim3;/*** brief 初始化定時器3用于延時* param 無* retval 無*/ void Delay_Init(void) {TIM_ClockConfigTypeDef sClock…

軟件功能測試和非功能測試有什么區別和聯系?

軟件測試是保障軟件質量的核心環節&#xff0c;而軟件功能測試和非功能測試作為測試領域的兩大重要組成部分&#xff0c;承擔著不同但又相互關聯的職責。 軟件功能測試指的是通過驗證軟件系統的各項功能是否按照需求規格說明書來正確實現&#xff0c;確保軟件的功能和業務流程…

使用Java調用TensorFlow與PyTorch模型:DJL框架的應用探索

在現代機器學習的應用場景中&#xff0c;Python早已成為廣泛使用的語言&#xff0c;尤其是在深度學習框架TensorFlow和PyTorch的開發和應用中。盡管Java在許多企業級應用中占據一席之地&#xff0c;但因為缺乏直接使用深度學習框架的能力&#xff0c;往往使得Java開發者對機器學…

Docker安裝beef-xss

新版的kali系統中安裝了beef-xss會因為環境問題而無法啟動&#xff0c;可以使用Docker來安裝beef-xss&#xff0c;節省很多時間。 安裝步驟 1.啟動kali虛擬機&#xff0c;打開終端&#xff0c;切換到root用戶&#xff0c;然后執行下面的命令下載beef的docker鏡像 wget https:…

metasploit(2)生成dll木馬

聲明&#xff01;本文章所有的工具分享僅僅只是供大家學習交流為主&#xff0c;切勿用于非法用途&#xff0c;如有任何觸犯法律的行為&#xff0c;均與本人及團隊無關&#xff01;&#xff01;&#xff01; 一、dll文件基本概念 DLL 是一種包含可由多個程序同時使用的代碼和數…

5V 1A充電標準的由來與技術演進——從USB誕生到智能手機時代的電力革命

點擊下面圖片帶您領略全新的嵌入式學習路線 &#x1f525;爆款熱榜 88萬閱讀 1.6萬收藏 一、起源&#xff1a;USB標準與早期電力傳輸需求 1. USB的誕生背景 1996年&#xff0c;由英特爾、微軟、IBM等公司組成的USB-IF&#xff08;USB Implementers Forum&#xff09;發布了…

使用Python設置excel單元格的字體(font值)

一、前言 通過使用Python的openpyxl庫&#xff0c;來操作excel單元格&#xff0c;設置單元格的字體&#xff0c;也就是font值。 把學習的過程分享給大家。大佬勿噴&#xff01; 二、程序展示 1、新建excel import openpyxl from openpyxl.styles import Font wb openpyxl.…

【設計模式】深入解析代理模式(委托模式):代理模式思想、靜態模式和動態模式定義與區別、靜態代理模式代碼實現

代理模式 代理模式&#xff0c;也叫委托模式。 Spring AOP 是基于動態代理來實現 AOP 的 定義 為其他對象提供一種代理 以控制對這個對象的訪問。它的作用就是通過提供一個代理類&#xff0c;讓我們在調用目標方法的時候&#xff0c;不再是直接對目標方法進行調用&#xff0c;而…

利用java語言,怎樣開發和利用各種開源庫和內部/自定義框架,實現“提取-轉換-加載”(ETL)流程的自動化

一、ETL 架構設計的核心要素? 在企業級數據處理場景中&#xff0c;ETL&#xff08;Extract-Transform-Load&#xff09;流程自動化是數據倉庫、數據湖建設的核心環節。基于 Java 生態的技術棧&#xff0c;我們可以構建分層解耦的 ETL 架構&#xff0c;主要包含以下四層結構&am…

2023藍帽杯初賽內存取證-8

也是用到pslist模塊&#xff0c;加上grep過濾”chrome“即可&#xff1a; vol.py --plugin/opt/volatility/plugins -f memdump.mem --profile Win7SP1x64 pslist | grep "chrome" 第一個是PID&#xff0c;第二個是PPID&#xff0c;第三個是線程數&#xff0c;第四個…

【C語言】動態內存的常見錯誤

前言&#xff1a; 在上章節中講解了動態內存的概念和管理的核心函數。 在本章節繼續為大家介紹動態內存的常見錯誤&#xff0c;讓大家更好的理解運用。 補充&#xff1a;使用內存函數需要頭文件<stdlib.h> 對NULL指針的解引用操作 當使用malloc、calloc或realloc等函…

uniapp-x 二維碼生成

支持X&#xff0c;二維碼生成&#xff0c;支持微信小程序&#xff0c;android&#xff0c;ios&#xff0c;網頁 - DCloud 插件市場 免費的單純用愛發電的

Linux內核之文件驅動隨筆

前言 近期需要實現linux系統文件防護功能&#xff0c;故此調研了些許知識&#xff0c;如何實現文件防護功能從而實現針對文件目錄防護功能。當被保護的目錄&#xff0c;禁止增刪改操作。通過內核層面實現相關功能&#xff0c;另外在通過跟應用層面交互從而實現具體的業務功能。…

利用大模型實現地理領域文檔中英文自動化翻譯

一、 背景描述 在跨國性企業日常經營過程中&#xff0c;經常會遇到專業性較強的文檔翻譯的需求&#xff0c;例如法律文書、商務合同、技術文檔等&#xff1b;以往遇到此類場景&#xff0c;企業內部往往需要指派專人投入數小時甚至數天來整理和翻譯&#xff0c;效率低下&#x…

鴻蒙Flutter倉庫停止更新?

停止更新 熟悉 Flutter 鴻蒙開發的小伙伴應該知道&#xff0c;Flutter 3.7.12 鴻蒙化 SDK 已經在開源鴻蒙社區發布快一年了&#xff0c; Flutter 3.22.x 的鴻蒙化適配一直由鴻蒙突擊隊倉庫提供&#xff0c;最近有小伙伴反饋已經 2 個多月沒有停止更新了&#xff0c;不少人以為停…