当前位置: 首页 > news >正文

H面试程序(0):字符串一些常用函数的实现

1、Strcat函数原型如下:

char *strcat(char *strDest, const char *strScr) //将源字符串加const,表明其为输入参数
{
       char * address = strDest;             //该语句若放在assert之后,编译出错
       assert((strDest != NULL) && (strScr != NULL)); //对源地址和目的地址加非0断言
       while(*strDest)             //是while(*strDest!=’\0’)的简化形式
       {                        //若使用while(*strDest++),则会出错,因为++是不受循环
              strDest++;               //约束的。所以要在循环体内++;因为要是*strDest最后指
       }                        //向该字符串的结束标志’\0’。
       while(*strDest++ = *strScr++) 
       {
              NULL;                 //该循环条件内可以用++,
       }                          //此处可以加语句*strDest=’\0’;有无必要?
return address;               //为了实现链式操作,将目的地址返回
}


 

2、Strcpy函数原型如下:

char *strcpy(char *strDest, const char *strScr)
{
       char *address=strDest;
       assert((strDest != NULL) && (strScr != NULL));
       while(*strScr)                   //是while(*strScr != ’\0’)的简化形式;
       {
              *strDest++ = *strScr++;
       }
       *strDest = '\0';                       //当strScr字符串长度小于原strDest字符串长度
       return address;                      //时,如果没有改语句,就会出错了。
}


3、Strcmp函数原型如下:

int strcmp (const char *str1,const char *str2)
{           
       int len = 0;
       assert((str1 != '\0') && (str2 != '\0'));
       while(*str1 && *str2 && (*str1 == *str2))
       {
              str1++;
              str2++;
       }
       return *str1-*str2;
}


4、Strlen函数原型如下:

int strlen(const char *str)
{
    int len = 0;
       assert(str != NULL);
       while(*str++)
       {
              len++;
       }
       return len;
}


5、memcpy函数

函数原型:void *memmove(void *dest, const void *source, size_t count)

返回值说明:返回指向dest的void *指针

参数说明:dest,source分别为目标串和源串的首地址。count为要移动的字符的个数

函数说明:memmove用于从source拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。

void *memcpy(void *dest, const void *source, size_t count)
{
   assert((NULL != dest) && (NULL != source));
   char *tmp_dest = (char *)dest;
   char *tmp_source = (char *)source;
   while(count --)//不对是否存在重叠区域进行判断
       *tmp_dest ++ = *tmp_source ++;
   return dest;
}


 

6、memmove函数

函数原型:void *memcpy(void *dest, const void *source, size_t count);

返回值说明:返回指向dest的void *指针

函数说明:memcpy功能和memmove相同,但是memcpy中dest和source中的区域不能重叠,否则会出现未知结果。

函数memcpy()   从source  指向的区域向dest指向的区域复制count个字符,如果两数组重叠,不定义该函数的行为。而memmove(),如果两函数重叠,赋值仍正确进行。

memcpy函数假设要复制的内存区域不存在重叠,如果你能确保你进行复制操作的的内存区域没有任何重叠,可以直接用memcpy。 如果你不能保证是否有重叠,为了确保复制的正确性,你必须用memmove。

void *memmove(void *dest, const void *source, size_t count)
{
   assert((NULL != dest) && (NULL != source));
   char *tmp_source, *tmp_dest;
   tmp_source = (char *)source;
   tmp_dest = (char *)dest;
   if((dest + count<source) || (source + count) <dest))
   {// 如果没有重叠区域
       while(count--)
       *tmp_dest++ = *tmp_source++;
   }
  else
  { //如果有重叠,反向拷贝。以避免源字符串被部分目的字符串覆盖
     tmp_source += count - 1;
     tmp_dest += count - 1;
     while(count--)
       *--tmp_dest = *--tmp;
  }
  
  return dest;
}

7.atoi

原型: int atoi(const char *nptr);

函数说明: 参数nptr字符串,如果第一个非空格字符不存在或者不是数字也不是正负号则返回零,否则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。

#include <stdio.h>
#include <assert.h>
static int atoi(const char* str)
{
    int result = 0;
    int sign = 0;
    assert(str != NULL);
    // proc whitespace characters
    while (*str==' ' || *str=='\t' || *str=='\n')
        ++str;

    // proc sign character
    if (*str=='-')
    {
        sign = 1;
        ++str;
    }
    else if (*str=='+')
    {
        ++str;
    }

    // proc numbers
    while (*str>='0' && *str<='9')
    {
        result = result*10 + *str - '0';
        ++str;
    }

    // return result
    if (sign==1)
       return -result;
    else
       return result;
}


 

7. itoa

char *itoaint value, char *string,int radix);

原型说明:

value欲转换的数据。

string:目标字符串的地址。

radix:转换后的进制数,可以是10进制、16进制等

char *itoa(int val, char *buf, unsigned radix)
{
    char   *p;             
    char   *firstdig;      
    char   temp;           
    unsigned   digval;     
    p = buf;
    if(val <0)
    {
        *p++ = '-';
        val = (unsigned long)(-(long)val);
    }
    firstdig = p; 
    do{
        digval = (unsigned)(val % radix);
        val /= radix;
       
        if  (digval > 9)
            *p++ = (char)(digval - 10 + 'a'); 
        else
            *p++ = (char)(digval + '0');      
    }while(val > 0);
   
    *p-- = '\0 ';         
    do{
        temp = *p;
        *p = *firstdig;
        *firstdig = temp;
        --p;
        ++firstdig;        
    }while(firstdig < p);  
    return buf;
}


 

 


 

 

转载于:https://www.cnblogs.com/bbsno1/p/3253799.html

相关文章:

  • 不容易系列之(4)——考新郎[HDU2049]
  • 正则表达式介绍
  • hdu 1029
  • SQL server经验分享:SQLSERVER 被标记为“可疑”的数据库处理方法
  • 代码自动生成工具MyGeneration之一(程序员必备工具)
  • ASP.NET中利用Split实现对Checkbox的字符串分离放到DataTable里面
  • Git基本操作(add,commit的理解)
  • 怎么编写测试驱动程序
  • 百度地图 - 合并模拟器和真机的静态库文件
  • vb常用命名空间
  • Java解析xml配置文件合成器
  • HTTP 状态代码及其定义
  • VS2008快捷键大全
  • 新浪微博API
  • STM32菜鸟成长记录---RS485通讯协议的应用
  • ES6 学习笔记(一)let,const和解构赋值
  • es的写入过程
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Redis字符串类型内部编码剖析
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • vue-router的history模式发布配置
  • 每天10道Java面试题,跟我走,offer有!
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • ​渐进式Web应用PWA的未来
  • #考研#计算机文化知识1(局域网及网络互联)
  • $.ajax()
  • (C++17) std算法之执行策略 execution
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (十三)Flask之特殊装饰器详解
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)Dubbo快速入门、介绍、使用
  • (一)WLAN定义和基本架构转
  • (转)visual stdio 书签功能介绍
  • (转)winform之ListView
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • /usr/bin/env: node: No such file or directory
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [2010-8-30]
  • [20161101]rman备份与数据文件变化7.txt
  • [Angular 基础] - 自定义指令,深入学习 directive
  • [Apio2012]dispatching 左偏树
  • [CF407E]k-d-sequence
  • [codevs1288] 埃及分数
  • [IE技巧] 让IE 以全屏模式启动
  • [Java并发编程实战] 共享对象之可见性
  • [LeetCode] Merge Two Sorted Lists
  • [LeetCode系列]3元素最近和问题的O(n^2)解法
  • [PyTorch][chapter 63][强化学习-QLearning]
  • [Search Engine] 搜索引擎技术之网络爬虫
  • [Silverlight]通过MVVM模式实现本地化/全球化(1)