目錄
前言
一、模擬實現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;
}
總結
關于本篇的內容就結束了,對你有幫助的可以點個贊