如何手动实现C语言中的字符串操作
学了字符串操作,很多人也许学了大概知道怎么用,但是太久没用就忘了,恰恰这是找软件工程师或者嵌入式工程师以及C,C++相关的笔试面试必考的题目!接下来我们来看看如何手动实现这些相关的函数。
废话不多说,直接上代码:
#include<stdio.h>
#include <stdlib.h>
//字符串拷贝
char * strcpy(char * dest,const char *src) ;
char * strncpy(char * dest,const char *src,size_t count) ;
//字符串黏贴
char * strcat(char * dest, const char * src) ;
char * strncat(char *dest, const char *src, size_t count) ;
//字符串比较
int strcmp(const char * cs,const char * ct) ;
//字符串查找
char * strchr(const char * s, int c) ;
char * strrchr(const char * s, int c);
//计算字符串有多少个字节
int strlen(const char * s);
//将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
void * memset(void * s,int c,size_t count) ;
//内存拷贝函数
void * memcpy(void * dest,const void *src,size_t count);
//由src所指内存区域复制count个字节到dest所指内存区域。
void * memmove(void * dest,const void *src,size_t count) ;
//比较内存区域buf1和buf2的前count个字节。该函数是按字节比较的。
int memcmp(const void * cs,const void * ct,size_t count);
int main(void)
{
//定义一个字符串
char *str = "Hello world!";
char *str1 = "hello world!";
char *str2 = "yangyuanxin";
char buffer[256];
//将数组的256块存储区域清空
memset(buffer , 0 ,256) ;
//将字符串str拷贝到buffer这个数组空间里去
strcpy(buffer , str);
printf("buffer:\n%s\n",buffer);
//比较字符串str与str1是否相同
if(strcmp(str,str1) == 0){
printf("字符串比较相同!\n");
}else{
printf("字符串比较不同\n");
}
//将str1黏贴到buffer这个字符串的后面
strcat(buffer , str1);
printf("buffer:\n%s\n",buffer);
//计算字符串的大小
printf("len:%d %d %d\n",strlen(str1),strlen(str),strlen(buffer));
//从前往后查找
printf("%s\n",strchr(str1 ,'o'));
//从后往前查找
printf("%s\n",strrchr(str1 ,'d'));
//由str2所指内存区域复制11个字节到buffer所指内存区域。
memmove(buffer , str2 , 11) ;
printf("%s\n",buffer);
//拷贝,跟memmove差不多的
memcpy(buffer , str1 ,11);
printf("%s\n",buffer);
//内存比较
if(memcmp(buffer , str2 ,11) == 0){
printf("内存区域相同!\n");
}else{
printf("内存区域不同!\n");
}
return 0 ;
}
char * strcpy(char * dest,const char *src)
{
char *tmp = dest;
while ((*dest++ = *src++) != '\0') //判断拷贝有没有到伪0
/* nothing */;
return tmp;
}
char * strncpy(char * dest,const char *src,size_t count)
{
char *tmp = dest;
while (count) { //count指的是要拷贝多少个字节
if ((*tmp = *src) != 0) src++;
tmp++;
count--;
}
return dest;
}
char * strcat(char * dest, const char * src)
{
char *tmp = dest;
while (*dest)
dest++;
while ((*dest++ = *src++) != '\0') //将src这个字符串黏贴到dest这个字符串的后面去
;
return tmp;
}
char * strncat(char *dest, const char *src, size_t count)
{
char *tmp = dest;
if (count) { //要黏贴多少个字节,这个接口比上面那个灵活
while (*dest)
dest++;
while ((*dest++ = *src++) != 0) {
if (--count == 0) {
*dest = '\0';
break;
}
}
}
return tmp;
}
int strcmp(const char * cs,const char * ct)
{
register signed char __res;
while (1) {
if ((__res = *cs - *ct++) != 0 || !*cs++) //字符串比较
break;
}
return __res;
}
char * strchr(const char * s, int c)
{
for(; *s != (char) c; ++s) //从前往后查找字符串中有没有存在的字符
if (*s == '\0')
return NULL;
return (char *) s;
}
char * strrchr(const char * s, int c)
{
const char *p = s + strlen(s); <span style="font-family: Arial, Helvetica, sans-serif;"> </span>
do { //从后往前查找
if (*p == (char)c)
return (char *)p;
} while (--p >= s);
return NULL;
}
int strlen(const char * s)
{
const char *sc;
for (sc = s; *sc != '\0'; ++sc) //计算字符串中有多少个字节
/* nothing */;
return sc - s;
}
//清楚内存区域
void * memset(void * s,int c,size_t count)
{
char *xs = (char *) s;
while (count--)
*xs++ = c;
return s;
}
//内存区域的拷贝
void * memcpy(void * dest,const void *src,size_t count)
{
char *tmp = (char *) dest, *s = (char *) src;
while (count--)
*tmp++ = *s++;
return dest;
}
//类似上面那个
void * memmove(void * dest,const void *src,size_t count)
{
char *tmp, *s;
if (dest <= src) {
tmp = (char *) dest;
s = (char *) src;
while (count--)
*tmp++ = *s++;
}
else {
tmp = (char *) dest + count;
s = (char *) src + count;
while (count--)
*--tmp = *--s;
}
return dest;
}
//内存区域比较,有点类似strcmp
int memcmp(const void * cs,const void * ct,size_t count)
{
const unsigned char *su1, *su2;
int res = 0;
for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
if ((res = *su1 - *su2) != 0)
break;
return res;
}
运行结果:
慢慢去学着写,绝对让你笔试无压力!!!
如何手动实现C语言中的字符串操作的更多相关文章
- C语言中返回字符串函数的四种实现方法 2015-05-17 15:00 23人阅读 评论(0) 收藏
C语言中返回字符串函数的四种实现方法 分类: UNIX/LINUX C/C++ 2010-12-29 02:54 11954人阅读 评论(1) 收藏 举报 语言func存储 有四种方式: 1.使用堆空 ...
- C语言中返回字符串函数的四种实现方法
转自C语言中返回字符串函数的四种实现方法 其实就是要返回一个有效的指针,尾部变量退出后就无效了. 有四种方式: 1.使用堆空间,返回申请的堆地址,注意释放 2.函数参数传递指针,返回该指针 3.返回函 ...
- C语言中格式字符串
C语言中格式字符串的一般形式为: %[标志][输出最小宽度][.精度][长度]类型, 其中方括号[]中的项为可选项. 一.类型 我们用一定的字符用以表示输出数据的类型,其格式符和意义下表所示: 字符 ...
- C语言中求字符串的长度
在C语言中求字符串的长度,可以使用sizeof()函数和strlen()函数,后者需要引入string.h (#include <string.h>) 因为C语言字符串是以 \0 结尾表示 ...
- C语言中以字符串形式输出枚举变量
C语言中以字符串形式输出枚举变量 摘自:https://blog.csdn.net/haifeilang/article/details/41079255 2014年11月13日 15:17:20 h ...
- Java中的字符串操作(比较String,StringBuiler和StringBuffer)
一.前言 刚开始学习Java时,作为只会C语言的小白,就为其中的字符串操作而感到震撼.相比之下,C语言在字节数组中保存一个结尾的\0去表示字符串,想实现字符串拼接,还需要调用strcpy库函数或者自己 ...
- SQL点滴33—SQL中的字符串操作
原文:SQL点滴33-SQL中的字符串操作 计算字符串长度len()用来计算字符串的长度 select sname ,len(sname) from student 字符串转换为大.小写lower() ...
- Python中的字符串操作总结(Python3.6.1版本)
Python中的字符串操作(Python3.6.1版本) (1)切片操作: str1="hello world!" str1[1:3] <=> 'el'(左闭右开:即是 ...
- Oracle中有关字符串操作的语法
Oracle中有关字符串操作的语法 Oracle提供了丰富的字符串函数 lpad()函数 lpad()函数用于左补全字符串.在某些情况下,预期的字符串为固定长度,而且格式统一,此时可以考虑使用lpad ...
随机推荐
- 在java程序中实现发送邮件的功能
最近比较忙,在做一个人事管理系统的项目,在这项目需求中,需要一个发送邮件的功能.这个时候我们可以使用javamail的jar包来实现完美需要的功能,在这里简单的分享一个最基础的发邮件功能. 首先我们需 ...
- Swift中方法(method)所谓的lazy绑定简介
我们知道在ruby之类的动态语言中对象方法可以先从类中预先抽取,然后再应用到某个具体对象上.这称为无绑定的method对象,也可以叫做lazy绑定. 下面举个例子: irb(main):004:0&g ...
- Scala:函数和闭包
http://blog.csdn.net/pipisorry/article/details/52902271 Scala函数 Scala 有函数和方法,二者在语义上的区别很小.Scala 方法是类的 ...
- 最大熵模型The Maximum Entropy
http://blog.csdn.net/pipisorry/article/details/52789149 最大熵模型相关的基础知识 [概率论:基本概念CDF.PDF] [信息论:熵与互信息] [ ...
- ubuntu垃圾清理命令
ubuntu的空间莫名不够用了 通过系统自带的工具磁盘使用分析器,发现var文件下面的log100多个g,这个日志文件是可以删除的,然后tmp文件也是可以删除的. 1.sudo rm -rf /tmp ...
- 网卡配置和DNS配置,手动挂在nas存储的共享目录,网络相关其它操作命令,修改防火墙中的端口配置,resolv.conf配置详细介绍和网卡信息配置详细介绍
1. 网卡配置和DNS配置 若想服务器能够发邮件,需要让部署的服务器能够访问到外网环境.若部署的服务器访问不到外网,通过ping www.baidu.com的方式执行的时候,会出现以下问题: &q ...
- Java编程思想阅读收获
15年8月份买了一本Java编程思想第四版中文版.之所以买中文版是因为我试读了同事的英文版发现自己英语水平还是有限,单词虽然认识,但对很多句子把握不准,这样看书太慢了,要理解英文还要理解技术有些hol ...
- NSDictionary writeToFile:atomically: 时失败
一.现象:如下图,当NSDictionary调用 writeToFile:atomically: 时,如果容器里面包含的对象(即通过 objectForKey: 拿到的对象),为非property l ...
- Android 异步查询框架AsyncQueryHandler的使用
AsyncQueryHandler简介: 异步的查询操作帮助类,可以处理增删改(ContentProvider提供的数据) 使用场景: 在一般的应用中可以使用ContentProvider去操作数据库 ...
- 开发人员需要熟知的常用Linux命令Version、Kernel查看
当我们需要在Linux系统中安装一些软件而去下载安装文件时,一般都需要确认到底下载哪个版本的安装包,这就需要我们知道自己的Linux系统到底是什么版本.什么内核,常见的版本.内核查看命令或者文件有如下 ...