浅谈C中操作字符串函数的用法(一)
按照内核string.h中函数的顺序进行大概的介绍,若干函数会给出一个简单的例子。有不足之处还希望各位看到的留言告知。
一、memcpy:
函数原型:extern void * memcpy(void *dest, const void *src, size_t n);
函数作用:将从src地址开始的n个字节拷贝到dest开始的地址中。返回值是指向dest的指针。
源码:
extern void *memcpy(void *dest, const void *src, size_t n)
{
void *ptmp_void = dest;
size_t tmp_size1, tmp_size2;
if (!n) {
return ptmp_void;
}
if ((long)dest & 1) {
char *str_dest = dest;
const char *str_src = src;
*str_dest++ = *str_src;
dest = str_dest;
src = str_src;
n--;
}
if (n > 2 && (long)dest & 2) {
short *s_dest = dest;
const short *s_src = src;
*s_dest++ = *s_src;
dest = s_dest;
src = s_src;
n -= 2;
}
tmp_size1 = n >> 2;
if (tmp_size1) {
long *l_dest = dest;
const long *l_src = src;
for (; tmp_size1; tmp_size1--) {
*l_dest ++ = *l_src;
}
dest = l_dest;
src = l_src;
}
if (n & 2) {
}
if (n & 2) {
short *s_dest =dest;
const short *s_src = src;
*s_dest++ = *s_src++;
dest = s_dest;
src = s_src;
}
if (n & 1) {
char *str_dest = dest;
const char *str_src = src;
*str_dest = *str_src;
}
return ptmp_void;
}
二、memmove:
函数原型:extern void *memmove(void *dest, void *src, size_t n);
函数作用:从src中拷贝n个字节到dest,如果目标区域重合,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
与memcpy的区别:当拷贝的dest和src有内存区域重合的时候,memmove更大程度的保证正确,而memcpy不能保证一定正确,但很多常用情况是正确的。相比较而言,memmove更为安全。
源码:
extern void *memmove(void *dest, const void *src, size_t n)
{
unsigned char *tmp_dest = dest;
const unsigned char *tmp_src = src;
if (dest == src) {
return dest;
}
if (dest < src) {
return memcpy(dest, src, n);
}
while (n -- ) {
tmp_dest[n] = tmp_src[n];
}
return dest;
}
三、memccpy:
函数原型:extern void *memccpy(void *dest, void *src, int c, size_t n);
函数作用:由src所指内存区域复制不多于count个字节到dest所指内存区域,如果遇到字符c则停止复制。返回值代表如果c没有被复制,则返回NULL,否则,返回字符c 后面紧挨一个字符位置的指针。意思就是只拷贝src中字符c之前的字符。
四、memset:
函数原型:extern void *memset(void *s, int c, size_t n);
函数作用:对s的前n个字节的每个字节都设置为c.
源码:extern void *memset(void *s, int c, size_t n)
{
int i;
char *ss = s;
for (i = 0; i < n; i++) {
ss[i] = c;
}
return s;
}
五、memcmp:
函数原型:extern int memcmp(const void *s1, const void *s2, size_t n);
函数作用:比较s1和s2中前n个字节。
源码:extern int memcmp(const void *s1, const void *s2, size_t n)
{
const unsigned char *su1, *su2;
int res = 0;
for(su1 = s1, su2 = s2; 0 < count; ++su1, ++su2, n--) {
if ((res = *su1 - *su2) != 0) {
break;
}
}
return res;
}
六、memchr:
函数原型:extern void *memchr(const void *s1, int c, size_t n);
函数作用:查找s1中的字符c。
源码:extern void *memchr(const void *s1, int c, size_t n)
{
const unsigned char *p =s;
while(n--) {
if ((unsigned char)c == *p++) {
return (void *)(p - 1);
}
}
return NULL;
}
浅谈C中操作字符串函数的用法(一)的更多相关文章
- 浅谈python中的闭包函数
闭包函数初探 通常我们定义函数都是这样定义的 def foo(): pass 其实在函数式编程中,函数里面还可以嵌套函数,如下面这样 def foo(): print("hello worl ...
- [技术]浅谈OI中矩阵快速幂的用法
前言 矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中,矩阵的运算是数值分析领域的重要问题. 基本介绍 (该部分为入门向,非入门选手可以跳过) 由 m行n列元素排列成的矩形阵列.矩阵里的 ...
- 浅谈JavaScript中的字符串操作
我想,最为一名开发人员,最实际开发过程中,任何一门语言在开发实际的项目的过程中,都是逃不开字符串的操作的下面笔者就自己日常开发过程中所用到的一些字符串的操作方法做一些陈述和总结,当然,如若读者觉得 ...
- 浅谈JS中的高级函数
在JavaScript中,函数的功能十分强大.它们是第一类对象,也可以作为另一个对象的方法,还可以作为参数传入另一个函数,不仅如此,还能被一个函数返回!可以说,在JS中,函数无处不在,无所不能,堪比孙 ...
- 浅谈ES6中的Async函数
转载地址:https://www.cnblogs.com/sghy/p/7987640.html 定义:Async函数是一个异步操作函数,本质上,Async函数是Generator函数的语法糖.asy ...
- 浅谈c++中map插入数据的用法
map:数据的插入 在构造map容器后,我们就可以往里面插入数据了.这里讲三种插入数据的方法:第一种:用insert函数插入pair数据 map<int, string> mapStude ...
- 【Java学习笔记之三十二】浅谈Java中throw与throws的用法及异常抛出处理机制剖析
异常处理机制 异常处理是对可能出现的异常进行处理,以防止程序遇到异常时被卡死,处于一直等待,或死循环. 异常有两个过程,一个是抛出异常:一个是捕捉异常. 抛出异常 抛出异常有三种形式,一是throw, ...
- 浅谈.net中数据库操作事务
.net中的事务 关键几点 概念:1:什么是事务 2:什么时候用事务 3:基本的语法 (1): 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常 ...
- 浅谈HTTP中GET、POST用法以及它们的区别
浅谈HTTP中GET.POST用法以及它们的区别 HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符.我们可以这样认为: 一 ...
随机推荐
- 对oracle数据库的数据迁移
导入:expdp 用户名/密码@ip/实例名 DUMPFILE=dump.dump EXCLUDE=TABLE:\"IN (\'表1\',\'表2\')\" 导出:impdp 用户 ...
- 5.JAVA基础复习——JAVA中的static关键字作用与用法
static关键字: 特点: 1.static是一个修饰符,用于修饰成员.(成员变量,成员函数)static修饰的成员变量 称之为静态变量或类变量. 2.static修饰的成员被所有的对象共享. 3. ...
- c# 将csv文件转换datatable的两种方式。
第一种: public static DataTable csvdatatable(string path) { DataTable dt = new DataTable(); string conn ...
- sourceTree 代码未同步合并
在同一个分支下,提交代码会有代码合并情形. 1.未同步代码前,提交代码 2.提交报错 3. 拉取未同步的提交代码 4.点击提交到暂存区, 5. 暂存区变成2条,再点击推送. 6.sourceTree ...
- linux 分析java 线程状态
将线程3117 的线程消息放到文件dump17中 jstack 13492 > dump17 分析线程 grep java.lang.Thread.State dump17 | awk '{pr ...
- Redis学习-主从复制、哨兵
主从复制 官方文档:https://redis.io/topics/replication Redis中的主从复制,也就是Master-Slave模型,有以下特点 Master可以拥有多个slave ...
- Windows10 引导修复
[问题]最近遇到一些用户使用的操作系统为Win10,但是使用过程中由于错误系统优化.卸载软件错误.误删系统文件.windows更新错误等,影响系统BCD引导文件,造成开机出现该BCD蓝屏报错,如下图所 ...
- js实现简易版validate
需求分析 项目中需要根据选择不同的类型,显示不同的表单,采用的方法是css隐藏显示不需要的表单,但是这个表单字段都是必填的,尝试把不同的表单放在不同的form里,提交时根据不同的类型调用miniui自 ...
- deno深入揭秘及未来展望
deno node.js之父Ryan Dahl在一个月前发起了名为deno的项目,项目的初衷是打造一个基于v8引擎的安全的TypeScript运行时,同时实现HTML5的基础API.所谓的安全运行时, ...
- 移动端开发注意事项——meta、rem以及弹性盒
移动端开发注意事项——meta.rem以及弹性盒 随着人们对移动端的依赖程度的增强,前端开发对移动端的需求也越来越强烈.那么,在移动端开发中,有哪些事项是需要注意的呢? meta标签 在常规的pc端开 ...