文章目录
1. 实现strcpy函数
题目描述:
已知strcpy函数的原型是:
char * strcpy(char * strDest,const char * strSrc);
1.不调用库函数,实现strcpy函数。
2.解释为什么要返回char *。
第一问 不调用库函数,实现strcpy函数
先给几个网友版本(第一问):
版本1:Strcpy面试题的解析和注意事项——李sir_Blog
#include <assert.h>
#include <stdio.h>
char * strcpy(char * strDest ,const char * strSrc)
{
assert((strDest!=NULL) && (strSrc !=NULL));
char * strDestCopy=strDest;
while ((*strDest++=*strSrc++)!='\0');
return strDestCopy;
}
版本2:面试题:模拟实现strcpy函数——[CSDN]dangzhangjing97
不过这份代码在返回值上并不符合题目要求(重点是拷贝思路)
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void my_strcpy(char *dest,const char *src)
{
assert(dest);//断言,目的是判断此指针是否是空指针,空指针不能解引用
assert(src);//断言,目的是判断此指针是否是空指针,空指针不能解引用
while (*src != '\0')
{
*dest = *src;
src++;
dest++;
}
*dest = *src;//把'\0'赋给目标字符串
}
————————————————
版权声明:本文为CSDN博主「dangzhangjing97」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dangzhangjing97/article/details/77870915
版本3:面试题—实现strcpy函数——青儿哥哥(存在错误!)
不像上面两种使用断言判断两个指针参数,而是直接判断是否为空,但是这个程序存在一个问题:strDest
结尾没有加\0
#include <stdio.h>
char *strcpy(char *strDest,char *strSrc)
{
if(strDest == NULL || strSrc == NULL)
return NULL;
char *p =strDest;
while(*strSrc != '\0')
{
*p = *strSrc;
strSrc++;
p++;
}
return strDest;
}
我的初始答案:(存在多个错误!)
char *strcpy(char *strDest,const char *strSrc)
{
char *p = strDest;
char *q = strSrc;
while(*q)
{
*p++ = *q++;
}
return strDest;
}
错误1:没有判断传入的指针是否为空!
错误2:strDest结尾没加\0
!
还有两个我不太确定的注意点(可能不算什么错误)
注意点1:strSrc已经是const形参,没必定义指针q。
注意点2:while(*q)
最好写成while(*q != '\0')
,不知道前者会有什么问题,但能肯定后者绝对没问题。
我的改进(不修改我的风格)
char *strcpy(char *strDest,const char *strSrc)
{
if(strDest == NULL || strSrc == NULL)
return NULL;
char *p = strDest;
while(*strSrc != '\0')
{
*p++ = *strSrc++;
}
*p = *strSrc; //'\0'
return strDest;
}
第二问:解释为什么要返回char
答:
有时候函数原本不需要返回值,但为了增加灵活性如支持链式表达,可以附加返回值。
如int length = strlen( strcpy(str, “Hello World”) );
参考文章——转载-strcpy 为什么需要返回值 为char*——[CSDN]EmbededCoder
2. 冒泡排序
冒泡排序没啥好研究的,优化我也不考虑了(嵌入式面试应该不会看重这个)
我的初始答案:(一般都用中间变量进行交换,但我喜欢用加减法
交换)
void Sort_Func(int *array, int len)
{
int i = 0, j = 0;
for(i = 0; i < len - 1; i++)
{
for(j = 0; j < len - 1 - i; j++)
{
if(array[j] > array[j + 1])
{
array[j] = array[j] + array[j + 1];
array[j + 1] = array[j] - array[j + 1];
array[j] = array[j] - array[j + 1];
}
}
}
}