1.strlen:計算字符串長度(不包含'\0')
實現想法:遍歷字符串,直到'\0'結束數組
#include<stdio.h> #include<stdlib.h> #include<string.h> //指針法 unsigned int mystrlenaddr(const char * str) //爲何使用const char,咱們只計數不對原數據進行改變 { int length = 0; //長度初始化爲0 while (*str++) { length++; } return length; } void main() { char * str = "fengcong is fucking too handsome"; //32個 //printf("%d\n", strlen(str)); printf("%d\n", mystrlenaddr(str)); system("pause"); }
2.strcmp:比較字符串大小(通常用於字符串排序)
實現想法:依次從字符串開始一直找到不一樣的那個字符進行比較,得出大小測試
#include<string.h> #include<stdio.h> #include<stdlib.h> //掌握指針法 int mystrcmp(char const * str1, const char * str2) { while (*str1 == *str2 && *str1 != '0') //一直找到兩個字符串不一樣的地方 { str1++; str2++; } if (*str1 > *str2) return 1; else if (*str1 < *str2) return -1; else return 0; } void main() { char * str = "feng1"; char * str1 = "feng2"; //printf("%d\n", strcmp(str, str1)); printf("%d\n", mystrcmp(str, str1)); system("pause"); }
3.strcpy:用於字符串複製(複製包含'\0')
實現想法:一直複製到'\0'結束spa
#define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<stdio.h> #include<string.h> //指針法 char * mystrcpyaddr(char * dest, const char * source) { if (dest == NULL || source == NULL) { return NULL; //若是目的操做或者源爲空,那麼久直接返回 } while (*dest++ = *source++) //裝X寫法 ; return dest; } //下標法 char * mystrcpyindex(char * dest, const char * source) { if (dest == NULL || source == NULL) { return NULL; //若是目的操做或者源爲空,那麼久直接返回 } int i = 0; while (source != '\0') { dest = source; i++; } dest = source; //由於要把最後的\0拷貝過去 return dest; } void main() { char * str = "fengcong is fucking too handsome"; char str1[100]; //目的字符數組 //strcpy(str1, str); //printf("%s\n", str1); mystrcpyindex(str1, str); printf("%s\n", str1); system("pause"); }
4.strstr:尋找母串中是否存在某個子串(稍難)
實現想法:依次比對指針
#include<stdio.h> #include<stdlib.h> #include<string.h> //下標 法 char * mystrstrindex(char * const momstr, const char * const sonstr)//前者指針指向的數據可變,可是指針不可變,後者都不可變 { int momlen = strlen(momstr); //母串的長度 int sonlen = strlen(sonstr); //子串的長度 for (int i = 0; i < (momlen - sonlen); i++) //從0開始循環母串,到momlen-sonlen中止 { int flag = 1; for (int j = 0; j < sonlen; j++) { if (momstr[i + j] != sonstr[j]) { flag = 0; break; //若是出現不相等就 退出循環,繼續從下面一個尋找 } } if (flag) { return (&momstr); } } return NULL; } //指針法 char * mystrstraddr(char * const momstr, const char * const sonstr) { char * mstr = momstr; //母串 while (*mstr) { char * sstr = sonstr; //子串 char * momnowstr = mstr; //記錄如今母串的位置 int flag = 1; while (*sstr != 0) { if (*sstr != *momnowstr || *momnowstr == '0') { flag = 0; break; } momnowstr++; sstr++; } if (flag) { return mstr; } mstr++; //母串對比位置+1 } return NULL; } void main() { char * str = "fengcong is too fucking handsome"; //printf("%p", strstr(str, "fengcong")); //printf("%p", mystrstrindex(str, "engcong")); printf("%p", mystrstraddr(str, "some")); system("pause"); }
5.itoa:整數轉字符串code
#define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<stdio.h> #include<string.h> char * myitoa(int value, char * str) { char * pstr = str; //str自己不能改變,一會要返回str if (value < 0) { *pstr = '-'; pstr++; value *= -1; //轉變爲正數處理 } int wei = 1; //數至少一位 int ivalue = value; //用於測試長度 while ((ivalue /= 10) != 0) { wei++; } pstr += wei-1; while (value % 10 != 0) { *pstr-- = (value % 10)+'0'; value /= 10; } return str; } void main() { int num = -45644; char str[20] = { 0 }; printf("%s", myitoa(num, str)); system("pause"); }
6.atoi:字符串轉整數(遇到非數字字符結束)blog
#include<stdlib.h> #include<stdio.h> #include<string.h> int myatoi(const char * str) { if (str == NULL) { return 0; } int num = 0; //須要返回的值 int flag = 1; //記錄正負號 if (*str == '-') { flag = -1; str++; } else if (*str == '+') { str++; } while (*str >= '0' && *str <= '9') { num= (num * 10 + (*str - '0')); str++; } return num*flag; } void main() { char str[20] = "-57124"; int num = 0; printf("%d\n",myatoi(str)); system("pause"); }
7.memcpy:拷貝某段內存排序
#include<stdio.h> #include<stdlib.h> #include<memory.h> //下標法 void * mymemcpybyindex(void * dest, const void * sor, size_t len) { if (dest == NULL || sor == NULL) { return NULL; } for (int i = 0; i < len; i++) { ((char*)dest) = ((char*)sor); } return dest; } //指針法 void * mymemcpybyaddr(void * dest, const void * sor, size_t len) { if (dest == NULL || sor == NULL) { return NULL; } char * pdest = dest; char * psor = sor; char * plast = (char * )sor + len; while (psor < plast) { *pdest++ = *psor++; } return dest; } void main() { char str[50] = "fengcong is fucking too handsome"; char * pstr = (char[50]) { 0 }; //在棧上開闢一段內存 //printf("%s\n", memcpy(pstr, str, 32)); printf("%s\n", mymemcpybyaddr(pstr, str, 31)); system("pause"); }
8.memset:對指定內存每一個字節賦某個值內存
#include<stdio.h> #include<stdlib.h> #include<memory.h> //下標法 void * mymemsetbyindex(void * dest, int val, size_t len) { if (dest == NULL) { return NULL; } if (len == 0) { return dest; } char * p = dest; for (int i = 0; i < len; i++) { p = val; } return dest; } //指針法 void * mymemsetbyaddr(void * dest, int val, size_t len) { if (dest == NULL) { return NULL; } if (len == 0) { return dest; } char * p = dest; char * plast = p + len; while (p < plast) { *p++ = val; } return dest; } void main() { char str[50] = "fengcong is fucking too handsome"; //printf("%s\n", memset(str, 65, 8)); printf("%s\n", mymemsetbyaddr(str, 65, 8)); system("pause"); }
9.memmove:和memcpy相似,可是memmove採用了中間空間,memcpy是直接拷貝
二者區別之處在於當拷貝地址重複的時候,結果不同(比較代碼可知)字符串
#include<stdlib.h> #include<stdio.h> #include<string.h> char * myftoa(double db, char * str) { char * pstr = str; //先判斷 符號位 if (db < 0) { *pstr = '-'; db *= -1; //轉爲正數處理 pstr++; } //整數部分 int zhengshu = (int)db; int izhengshu = zhengshu; //犧牲於記錄整數長度 int wei = 1; //整數部分至少一位 while ((izhengshu /= 10) != 0) { wei++; } pstr += wei - 1; for (int i = 0; i < wei; i++) { *pstr-- = zhengshu % 10 + '0'; zhengshu /= 10; } pstr += (wei+1); *pstr = '.'; pstr++; //小數部分 double xiaoshu = db - (int)db; for (int i = 0; i < 6; i++) { *pstr++ = (int)(xiaoshu * 10) + '0'; xiaoshu = xiaoshu * 10 - (int)(xiaoshu * 10); } return str; } void main() { double db = -2.11; char str[20] = { 0 }; printf("%s\n", myftoa(db,str)); system("pause"); }
10.memchr:某段內存中尋找某個值string
#include<stdio.h> #include<stdlib.h> #include<memory.h> void * mymemchar(void * buf, int val, size_t size) { if (buf == NULL) { return NULL; } char * p = buf; char plast = p + size; while (p < plast) { if (*p == val) { return p; } p++; } return NULL; } void main() { char str[50] = "fengcong is fucking too handsome"; printf("%s\n", mymemchar(str, 'g', 8)); system("pause"); }
11.memccpy:內存拷貝,直到一個值結束
#include<stdio.h> #include<stdlib.h> #include<memory.h> //下標法 void * mymemccpybyindex(void * dest, const void * sor,int val, size_t len) { if (dest == NULL || sor == NULL) { return NULL; } for (int i = 0; i < len; i++) { if( (((char*)dest) = ((char*)sor)) == val) return dest; } return dest; } //指針法 void * mymemccpybyaddr(void * dest, const void * sor,int val, size_t len) { if (dest == NULL || sor == NULL) { return NULL; } char * pdest = dest; char * psor = sor; char * plast = (char *)sor + len; while (psor < plast) { if ((*pdest++ = *psor++) == val) return dest; } return dest; } void main() { char str[50] = "fengcong is fucking too handsome"; char * pstr = (char[50]) { 0 }; //在棧上開闢一段內存 //printf("%s\n", memccpy(pstr,str,'s',32)); printf("%s\n", mymemccpybyaddr(pstr, str, 'f', 32)); system("pause"); }
12.memicmp:比較某段內存大小(一個字節一個字節比較,像strcmp)
注意:切不可用來比較整數,除非一字節整數,由於整數存儲方式是高位高字節
#include<stdio.h> #include<stdlib.h> #include<memory.h> int mymemicmpbyaddr(const void * buf1, const void * buf2, size_t size) { char * p1 = buf1; char * p2 = buf2; int i = 0; while(*p1 == *p2 && i < size) { p1++; p2++; i++; } if (*p1 > *p2) { return 1; } else if (*p1 < *p2) return -1; else return 0; } void main() { char str[50] = "fengcong is fucking too handsome"; char str1[50] = "fengfeng is fucking too handsome"; printf("%d\n", mymemicmpbyaddr(str, str1, 32)); system("pause"); }