1.C 库函数实现
Char * strcpy(char* s1, const char * s2)
{
Char* s=s1;
While (*s1++=*s2++);
return s1;
}
char *strncpy(char *s1, const char *s2, size_t n)
{
Char* s=s1;
While (*s++=*s2++)&&(s1-s<=n);
Return s1;
}
Int strcmp(const char* s1, const char * s2)
{
While (*s1&&*s2&&(*s1++==*s2++));
Return (*--s1)-(*--s2);
}
char *strcat(char *s1, const char *s2)
{
Char* s=s1;
For(;*s1;s1++);
while (*s1++=*s2++);
return s1=s;
}
Int *strlen(char * s)
{
For(char * s1=s;*s1;s1++);
Return s1-s;
}
static const char* strstr(const char* s1, const char* s2)
{
assert(s2 && s1);
const char* p=s1, *r=s2;
while(*p)
{
while(*p++==*r++);
if(!*--r)
return s1;
else
{
r=s2;
p=++s1;
}
}
return NULL;
}
Int substrpstn(const char* s1, const char*s2)
{
int pstn=1;
char * p=s1, *q=s2;
while (*p)
{
while (*p++==*q++);
if (*--q)
Return pstn;
Else
{
q=s2;
p=++s1;
i++;
}
}
Return 0;
}
Char* reverse(char* s1)
{
char * p=s1, *q=s1;
While (*q++);
q-=2;
while (p<q)
{
*p=*p+*q;
*q=*p-*q;
*p=*p-*q;
P++;
q++;
}
Return s1;
}
Int chkIntgtr(char c)
{
Return (c>=’0’)&&(c<=’9’)?(c-‘0’):-1;
}
Void * malloc(int size)
{
Return static_cast<void*>(new char[size]);
}
void itoa(int input, char* s)
{
Int i=input;
Char* s1=s, *s2=s;
input=(input>=0)?input:-input;
do
{
*S2++=input%10+’0’;
}while(input/10);
If (i<0)
*s2++=’-’;
s2=’/0’;
s2--;
while(s1<s2)
{
*s1=*s1+*s2;
*s2=*s1-*s2;
*s1++=*s1-*s2--;
}
}
2. 在一个函数中,如果用数组名做形参,那么编译器会把其退化为一个指针对待(即使函数声明中的形参是数组),所以sizeof结果为4,正好是一个指针的大小。所以我们在f函数中可以写:n++,而在main中m++却报错,就是这个原因,一个是指针,一个是数组,指针是变量可以修改,数组名是常量,不可以修改。
3. 两个指针指向同一数组(字符串)时,高位的指针与低位的指针相减是整数(两指针之间相差的元素个数, 当然指针的类型和数组的类型应一致)
4. 字符指针数组的大小 列数*4。
5. 内存操作规则:
【规则1】用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。
【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。
【规则3】避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。
【规则4】动态内存的申请与释放必须配对,防止内存泄漏。
【规则5】用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。
几个C库函数的简单实现
最新推荐文章于 2022-06-19 22:26:49 发布