面试题:优化中的优化(10分满分)
字符串拷贝:是将一个字符串的内容复制到另一个字符串中的操作。
运用函数模拟字符串拷贝:(5分)
模拟字符串拷贝
#include <stdio.h>
void my_strcpy(char* dest, char* str)
{while (*str != '\0'){*dest = *str;str++;dest++;}*dest = *str;}
int main()
{strcpy字符串拷贝char arr1[] = "##########";char arr2[] = "柯南";my_strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}
对于以上代码进行优化:(6分)
后置++的使用和赋值的灵活使用让代码更加简洁:
//优化模拟strcpy
#include <stdio.h>
void my_strcpy(char* dest,char*scr)
{while (*dest++ = *scr++)//第二个优化 {;//*dest++ = *scr++;//第一个优化}
}
int main()
{char arr1[] = "##########";char arr2[] = "柯南";my_strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}
更加一步的优化:排除野指针的优化(7分)
//排除NULL的使用(进一步优化)
#include <stdio.h>
void my_strcpy(char* dest, char* scr)
{if (dest != NULL && scr != NULL){while (*dest++ = *scr++)//第二个优化{;//*dest++ = *scr++;//第一个优化}}
}
int main()
{char arr1[] = "##########";char arr2[] = "柯南";my_strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}
assert的断言的使用:(进行报错的提示)(8分)
//进行报错的提示:
#include <stdio.h>
#include <assert.h>
void my_strcpy(char* dest, char* src)
{assert(dest != NULL);assert(src != NULL);while (*dest++ = *src++){;}
}
int main()
{char arr1[] = "##########";char arr2[] = "柯南";my_strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}
const求改,和返回值的修改(不可修改的左值)(10分):
//const求改,和返回值的修改(不可修改的左值)
#include <stdio.h>
#include <assert.h>
char *my_strcpy(char* dest, const char* src)
{char* ret = dest;assert(src != NULL);assert(dest != NULL);while (*dest++ = *src++){;}return ret;
}
int main()
{char arr1[] = "##########";char arr2[] = "柯南";printf("%s", my_strcpy(arr1, arr2));return 0;
}