题一:
模拟实现strncpy
#include <stdio.h>void my_strncpy(char* arr2, char* arr1, size_t num){int i = 0;for (i = 0; i < num; i++){*(arr2 + i) = *(arr1 + i);}}int main(){char arr1[] = "hello liangzai";char arr2[10] = { 0 };//strncpy(arr2,arr1,sizeof(arr2));my_strncpy(arr2, arr1, sizeof(arr2));return 0;}
优解一:
char * mystrncpy(char * dst, const char * src, size_t n)
{int i;for (i = 0; src[i] && i < n; i++){dst[i] = src[i];}if (i < n){dst[i] = 0;}return dst;
}
题二:
模拟实现strncat
#include <stdio.h>#include <string.h>char* my_strncat(char* arr1, const char* arr2, size_t num){int sz = strlen(arr1);int i = 0;for (i = 0; i < num; i++){*(arr1 + sz + i) = *(arr2 + i);}return arr1;}int main(){char arr2[] = "shawanyi ";char arr1[20] = "hello ";//strncat(arr1,arr2,10);my_strncat(arr1, arr2, 10);return 0;}
优解一:
char * mystrncat(char * dst, const char * src, size_t n)
{char * tmp = dst;while (*dst){dst++;//记录到dst最后一个位置}int i;for (i = 0; src[i] && i < n; i++){dst[i] = src[i];}dst[i] = 0;return tmp;
}
题三:
模拟实现atoi
#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <ctype.h>int my_atoi(const char* arr1){assert(arr1);int sum = 0;if (*(arr1) == '\0'){return 0;}while(isspace(*arr1)){arr1++;}int flat = 1;if (*arr1 == '+'){arr1++;}else if (*arr1 == '-'){flat = -1;arr1++;}int ret = 0;while (isdigit(*arr1)){ret = ret * 10 + (*arr1 - '0');if (ret > INT_MAX){return INT_MAX * flat;}else if (ret < INT_MIN){return INT_MIN * flat;}arr1++;}if (isdigit(*arr1) == 0){return ret * flat;}return ret*flat;}int main(){char arr1[] = "-123666a44";//int n = atoi(arr1);int sz = 0;sz = my_atoi(arr1);return 0;}
优解一
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
//VALID 表示结果合法
//INVALID 表示结果非法
enum State
{VALID,//0INVALID//1
};
//默认结果可能非法,当正确转换后再改为合法
enum State state = INVALID;
int my_atoi(char *str)
{int flag = 1;long long ret = 0;assert(str);state = INVALID;//跳过空白字符while(isspace(*str)){str++;}if(*str == '\0'){return 0;}//跳过正负号if(*str == '+'){str++;}else if(*str == '-'){flag = -1;str++;}//开始转换数字字符直到非数字字符while(isdigit(*str)){ret = ret * 10 + flag * (*str-'0');if((ret > INT_MAX) || (ret < INT_MIN)){return 0;}str++;}//正常停止if(*str == '\0'){state = VALID;return (int)ret;}else{//遇到非数字字符return (int)ret;}