面试题:优化中的优化(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;
}