`

几个C库函数的简单实现

阅读更多

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的几个string库函数简单实现

    C语言string库函数实现详解 本文将详细介绍C语言中的string库函数的实现,包括strlen、strcpy、strcat、strcmp、strstr、memcpy和memmove等函数的实现。这些函数都是C语言中常用的字符串操作函数, MASTERING它们...

    C语言库函数大总结

    这里简要列出几个常见的图形处理库函数: 1. **`initgraph`**: - 初始化图形环境。 2. **`getaspectratio`**: - 获取图形窗口的纵横比。 3. **`circle`** 和 **`ellipse`**: - 绘制圆形和椭圆。 4. **`...

    单片机几个头文件及库函数

    总的来说,理解和掌握这些头文件及库函数是单片机开发中必不可少的技能,它们使得我们能够方便地与各种硬件设备交互,实现功能丰富的嵌入式系统。通过学习和使用这些资源,可以快速地在项目中集成显示、时间管理和...

    库函数的流水灯,几个版本

    例如,一个常见的微控制器如Arduino,有丰富的库支持,如“Wire”库用于I2C通信,“ShiftOut”库则专门用于位移输出,非常适合流水灯。在使用这些库时,我们首先需要包含相应的头文件,然后调用库函数来初始化和控制...

    C库函数查询

    C库函数主要分为以下几个类别: 1. 输入/输出(I/O)函数:如`printf`用于格式化输出,`scanf`用于从标准输入读取数据,`fopen`和`fclose`用于文件操作等。这些函数让开发者能够与用户交互,并处理文件数据。 2. ...

    Keil C51库函数(全) C51强大功能及其高效率的重要体现之一在于其丰富的可直接调用的库函数,多使用库函数使程序代码简单,结构清晰,易于调试和维护,下面介绍C51的库函数系统

    Keil C51的库函数主要包括以下几类: 1. **Intrinsic Routines** - 这些函数是C51编译器内建的特殊函数,可以直接被调用。 - 例如:_crol_, _cror_等用于位循环操作的函数。 2. **标准库函数** - 这些函数与标准...

    C图形库函数 可以查询、包含各种C图形库函数

    C图形库函数提供了一系列用于图形绘制的基本功能,涵盖了从简单线条到复杂多边形的各种图形操作。这些函数主要在`graphics.h`头文件中定义,是进行图形界面编程的基础工具。 ### 图形绘制基础 #### putpixel()与...

    ege库函数实现生命游戏迭代过程

    总的来说,"ege库函数实现生命游戏迭代过程"是一个结合了C语言编程、数据结构(数组)、图形界面编程和细胞自动机理论的项目。它既锻炼了编程能力,又提供了理解复杂系统动态性的机会。通过这样的实践,学习者可以...

    STM32 8位数码管动态扫描实验(不用库函数) 完整C语言代码 供学习和参考

    在本实验中,我们将探讨如何使用C语言在STM32上实现8位数码管的动态扫描,而不依赖库函数。这有助于理解底层硬件操作和提高代码效率。 一、数码管工作原理 数码管,也称为七段显示器,由8个发光二极管组成,通过...

    HI-TECH PICC库函数

    HI-TECH PICC库函数主要包含以下几个方面的内容: 1. **基本输入/输出(I/O)操作**:这些函数用于配置和控制微控制器的端口,如设置方向、读写数据以及进行中断处理。例如,`putc()` 和 `getc()` 函数用于串行通信...

    HAL库函数手册 .docx

    例如,定时器API接口被划分为几个类别,根据IP提供的功能来区分,如基本定时器、捕获定时器、脉冲宽度调制(PWM)等。 #### 五、HAL库的实际应用 1. **初始化和配置**:HAL库提供了初始化和配置外设所需的API接口...

    HAL库函数手册.pdf

    HAL库具有以下几个显著特点: - **多实例简单API集合**:HAL库提供了一个简单易用的API集合,用于与上层应用进行交互。 - **通用架构**:HAL库基于一个通用的架构构建,使得上层软件无需深入了解底层硬件细节即可...

    arduino库函数大全

    在Arduino中关于通信、网络和协议方面,Arduino提供了几个专门的库,包括: - Messenger库,用于处理来自计算机的基于文本的消息; - NewSoftSerial库,为基于软件的串行通信提供了一个改进的版本; - OneWire库,...

    C语言实现AES加密解密

    C语言实现AES加密解密主要涉及以下几个关键步骤: 1. **密钥扩展**:AES的密钥扩展过程将用户提供的原始密钥扩展成多个轮密钥,用于后续的加密和解密过程。这个过程涉及到线性和非线性的组合运算。 2. **状态矩阵...

    DSP6678 TI公司官方STK库函数例程和使用方法

    STK库主要由以下几个部分组成: 1. 基础库:提供基本的数据类型定义、内存管理、错误处理等功能。 2. 处理器接口库:包含针对C6678硬件特性的函数,如中断管理、时钟配置等。 3. 数学运算库:提供了浮点和定点数学...

    linux_c_库函数大全.rar

    C库函数手册通常包含以下几个部分: 1. **标准输入/输出(stdio)**:如`printf`和`scanf`,用于处理标准输入、输出和错误流,是进行基本I/O操作的基础。 2. **字符串处理(string)**:例如`strcpy`、`strcat`、`...

    Hilbert的C语言实现

    在C语言中实现Hilbert变换,我们可以分为以下几个步骤进行讲解。 首先,我们要理解Hilbert变换的基本概念。Hilbert变换定义为:对于一个实值函数f(t),它的Hilbert变换H[f](t)可以通过下面的公式得到: \[ H[f](t)...

    STM32 库函数(2.02版)汉化版

    STM32库函数主要分为几个部分: 1. **HAL库**(Hardware Abstraction Layer):这是ST公司推出的高级库,旨在提供与具体硬件无关的API,简化编程并提高代码可移植性。HAL库包含了大量的驱动函数,如GPIO、ADC、TIM...

    STM32的UART串口2Printf简单打印(STM32神舟IV号-库函数版)程序,亲测能用

    在STM32的UART配置中,我们需要关注以下几个关键步骤: 1. **初始化配置**:包括波特率设置、数据位数、停止位数、校验位以及流控选项。例如,通常我们会选择9600波特率、8位数据、1位停止位、无校验位和无流控。 ...

Global site tag (gtag.js) - Google Analytics