天天看點

c語言程式設計實作strlen,C語言實作strlen,atoi, strcpy等函數

strlen的實作很簡單:

如下:

int my_strlen(const char* p) { assert(p != NULL); int len =0; while (*p++) { len++; } return len; }

strcmp的實作:

int my_cstrcmp(const char* p , const char* q) { assert(p != NULL && q != NULL); //循環找到第一個不相等的字元 for (; *p == * q; ++p, ++q) { if (*p == 0) { return 0; } } return *(unsigned char*)p - *(unsigned char*)q >0 ? 1:-1; }

strcpy函數實作: char* myStrcpy(char* des, const char* source) { assert(des != NULL && source != NULL); char* ret = des; while ( (*des++ = *source++) != '/0'); return ret; }

itoa 函數實作:

void itoaTest(int num,char str[] ) { int sign = num,i = 0,j = 0; char temp[11]; if(sign<0)//判斷是否是一個負數 { num = -num; }; do { temp[i] = num%10+'0'; num/=10; i++; }while(num>0); if(sign<0) { temp[i++] = '-'; } temp[i] = '/0'; i--; while(i>=0) { str[j] = temp[i]; j++; i--; } str[j] = '/0'; }

atoi函數實作:

int atoiTest(char s[]) { int i = 0,sum = 0,sign; //輸入的數前面可能還有空格或制表符應加判斷 while(' '==s[i]||'/t'==s[i]) { i++; } sign = ('-'==s[i])?-1:1; if('-'==s[i]||'+'==s[i]) { i++; } while(s[i]!='/0') { if (s[i] >= 0 && s[i] <= '9') { sum = s[i]-'0'+sum*10; i++; } else { break; } } return sign*sum; }

反轉字元串遞歸實作:

char* reverse(char *str) { assert(str != NULL); int iLen = strlen(str); char c; int i; if (iLen<2) { return NULL; } else { //先把首尾交換 c = str[0]; str[0] = str[iLen-1]; str[iLen-1] = c; //如果長度為2的話,傳回null if (iLen == 2) { return NULL; } // 輔助空間,用來儲存原字元串沒有反轉的部分 char *str2 = (char*)malloc(iLen-1); memset(str2, '/0', iLen-1); //拷貝字元串 for (i=0; i