欢迎来到千学网!
您现在的位置:首页 > 实用文 > 其他范文

C语言 字符串的内存拷贝处理函数

时间:2022-11-20 09:42:58 其他范文 收藏本文 下载本文

下面是小编为大家收集的C语言 字符串的内存拷贝处理函数,本文共7篇,仅供参考,欢迎大家阅读,希望可以帮助到有需要的朋友。

C语言 字符串的内存拷贝处理函数

篇1:C语言 字符串的内存拷贝处理函数

对于字符串来说,我们运用字符串中的str类别的函数,但是我们还有一些关于内存的拷贝函数,

C语言 字符串的内存拷贝处理函数

。他们操作的对象是内存,然后可以接受任何类型的数据进行拷贝。

这个是里面的memcpy,然后我们一起查看一下MSDN看一看他的原型:

void *memcpy(void *dest,const void *src,size_t count);

与strcpy不同的就是添加了第三个参数,确定操作的字节数,然后参数类型还有返回类型都是void*

,这表示他可以拷贝任意类型的数据。

然后我们看一下实现:

memcpy:

void *my_memcpy(void *str,const void *Dstr,int count) //从内存地址开始改变,并确定改变长度,所以用万能类型去接受{ char *pstr = (char *)str; char *pDstr = (char *)Dstr;assert((str!=NULL) && (Dstr != NULL)); if(str == Dstr) //位置相同情况下直接返回需要改变的 return (char *)Dstr; while(count-- >0){*pstr++ = *pDstr++;} return str;}

然后会出现一个问题,如果我们拷贝的数据中Dstr的起始位置在STR操作之间,那么在改变str时会出现副作用,将导致我们的拷贝结果不正确,所以我们应该考虑到会覆盖的情况,

在函数库中有一个memmove函数。

memmove:

void *my_memmove(void *pst,const void *Dpst,int size){ void *p = pst; char *pstA = (char *)pst; char *pstB = (char *)Dpst;assert((pst != NULL) &&(Dpst != NULL)); if(pstB

就是遇到被拷贝的空间起始处在拷贝空间中,将会遇到拷贝内存覆盖的现象。在这种情况下我们将考虑从尾部进行拷贝。所以进行了判断。

篇2:C语言字符串拷贝strcpy函数的陷阱分析

在C语言中,我们都知道字符串是永恒的话题,字符串含有很多地雷,你稍不留心就会被砸到,比方说,字符串的结尾是'\0',也是占一个字符空间的,那么如果我们在利用strcpy拷贝字符串的时候,应该多加1个字符空间,就是专门留给这个'\0'的,

如果我们不多加一个字符空间,会发生致命的错误,那么我们通过案例来说明。

-------------我是分割线------------------

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

# include 

# include 

# include 

int main

{

char str[] = “MengLiang”;

//此处分配空间没有考虑到'\0'

char* New_str = (char*)malloc(strlen(str));

strcpy(New_str, str);

printf(“The New_str = %s\n”, New_str);

free(New_str);

New_str = NULL;

system(“pause”);

return 0;

}

-------------我是分割线------------------

我在注释中已经写了,那么这小段程序的结果呢?

-------------我是分割线------------------

正确的修改为:

-------------我是分割线------------------

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

# include 

# include 

# include 

int main()

{

char str[] = “MengLiang”;

//此处的加1就是为'\0'来服务的

char* New_str = (char*)malloc(strlen(str)+1);

strcpy(New_str, str);

printf(“The New_str = %s\n”, New_str);

free(New_str);

New_str = NULL;

system(“pause”);

return 0;

}

-------------我是分割线------------------

C语言的自由意味着我们要自制!

----------------------------------------------

本文出自 “享受科技带来的快乐” 博客,请务必保留此出处liam2199.blog.51cto.com/2879872/146

篇3:(C语言)字符串比较函数,指针数组与数组指针

问题描述:

写一个函数,用于比较两个字符串的比较(string_compare).

程序分析:

(1)主要思想:传入两个字符串后,比较这两个字符串中的每个元素,如果第一次比较就不相等,就不要让它进入到下面的比较中,这样一来,将它返回一个相减的值(即:两数组中开始不相等的那两个元素相减,返回值(int类型),是ASCII码值相减)。进入比较的过程中时,相等就返回0;其他情况都返回那个相减的值。

(2)主要方式:定义指针数组,并对其初始化。然后照上面的思想,进行代码的实现。

代码如下:

/***指针数组(1)int *a[10] 是一个指针数组--->是一个数组(每个数组中的元素都是int*类型)(2)int (*a)[10] 是一个数组指针--->指向一个数组(十个int类型的数组) 注意:*,[],的优先级依次递增。下面使用了指针数组的例子,至于数组指针。。**/#include#includeint string_compare(const char *str1,const char *str2){ assert(str1); //ASSERT( f ) assert(str2);/*在Debug模式下,每次运行到这里后会计算括号中的表达式,如果表达式为0,则中断执行,弹出一个警告框,用户可选择“继续”,“重试”,“忽略”在Release模式下,这句语句不会被编译进代码, ASSERT一般用于程序内部确认参数的正确性,即调用内部函数的时候,要由调用者保证参数的正确,而被调用函数内部,就可以通过ASSERT来检查参数是否满足要求。*/ while(*str1 == *str2 ) //判断两个数组中的元素是否相等 { str1++; //使两个指针指向下一位;继续比较 str2++; if(*str1 == '\0') //双方比较到'\0'处,都相等 { return 0; //返回0,表示二字符串相等 } } return *str1-*str2; //若不相等,返回一个正值或负值}int main(){ char *ch[2]; ch[0] = “ab”; //对这个指针数组的元素初始化,使其指向这个字符串首元素的首地址 ch[1] = “a”; //同上 printf(“%d\n”,string_compare(ch[0],ch[1])); //调用这个函数 return 0;}

篇4:jstl 字符串处理函数

作者: 字体:[增加 减小] 类型:

最近用jstl1.0 的时候经常要在页面上对字符串做改动,在网上找了一个写的不错的,借鉴一下

JSTL使用表达式来简化页面的代码,这对一些标准的方法,例如bean的getter/setter方法,请求参数或者context以及session中的数据的访问非常方便,但是我们在实际应用中经常需要在页面调用对象的某些方法,例如我需要调用字符串的length方法来获取字符串的长度时,在以往的开发过程中我们必须把对象先转为String类,然后在调用其length方法,这样的代码繁琐而且容易出错,

因此JSTL内置了几个用于字符串操作的方法,可以直接在表达式中使用,大大的简化了代码,提供代码的可读性。在JSTL的表达是中要使用一个函数,其格式如下

${ns:methodName(args....)}

在使用这些函数之前必须在JSP中引入标准函数的声明

<%@ taglib prefix=“fn” uri=“java.sun.com/jsp/jstl/functions” %>

下面是JSTL中自带的方法列表以及其描述

函数名函数说明使用举例contains判断字符串是否包含另外一个字符串containsIgnoreCase判断字符串是否包含另外一个字符串(大小写无关)endsWith判断字符串是否以另外字符串结束escapeXml把一些字符转成XML表示,例如<字符应该转为><${fn:escapeXml(param:info)}indexOf子字符串在母字符串中出现的位置${fn:indexOf(name, “-”)}join将数组中的数据联合成一个新字符串,并使用指定字符格开${fn:join(array, “;”)}length获取字符串的长度,或者数组的大小${fn:length(shoppingCart.products)}replace替换字符串中指定的字符${fn:replace(text, “-”, “•”)}split把字符串按照指定字符切分${fn:split(customerNames, “;”)}startsWith判断字符串是否以某个子串开始substring获取子串${fn:substring(zip, 6, -1)}substringAfter

获取从某个字符所在位置开始的子串

${fn:substringAfter(zip, “-”)}substringBefore获取从开始到某个字符所在位置的子串${fn:substringBefore(zip, “-”)}toLowerCase转为小写${fn.toLowerCase(product.name)}toUpperCase转为大写字符${fn.UpperCase(product.name)}trim去除字符串前后的空格${fn.trim(name)}

篇5:C语言内存分配函数malloc、calloc和realloc

C语言中常用的内存分配函数有malloc、calloc和realloc等三个,其中,最常用的肯定是malloc,这里简单说一下这三者的区别和联系,

1、声明

这三个函数都在stdlib.h库文件中,声明如下:

void* realloc(void* ptr, unsigned newsize);

void* malloc(unsigned size);

void* calloc(size_t numElements, size_t sizeOfElement);

它们的功能大致类似,就是向操作系统请求内存分配,如果分配成功就返回分配到的内存空间的地址,如果没有分配成功就返回NULL。

2、功能

malloc(size):在内存的动态存储区中分配一块长度为“size”字节的连续区域,返回该区域的首地址。

calloc(n,size):在内存的动态存储区中分配n块长度为“size”字节的连续区域,返回首地址。

realloc(*ptr,size):将ptr内存大小增大或缩小到size。

需要注意的是realloc将ptr内存增大或缩小到size,这时新的空间不一定是在原来ptr的空间基础上,增加或减小长度来得到,而有可能(特别是在用realloc来增大ptr的内存空间的时候)会是在一个新的内存区域分配一个大空间,然后将原来ptr空间的内容拷贝到新内存空间的起始部分,然后将原来的空间释放掉。因此,一般要将realloc的返回值用一个指针来接收,下面是一个说明realloc函数的例子。

#include#includeint main{ //allocate space for 4 integers int *ptr=(int *)malloc(4*sizeof(int)); if (!ptr) { printf(“Allocation Falure!\n”); exit(0); } //print the allocated address printf(“The address get by malloc is : %p\n”,ptr); //store 10、9、8、7 in the allocated space int i; for (i=0;i<4;i++) { ptr[i]=10-i; } //enlarge the space for 100 integers int *new_ptr=(int*)realloc(ptr,100*sizeof(int)); if (!new_ptr) { printf(“Second Allocation For Large Space Falure!\n”); exit(0); } //print the allocated address printf(“The address get by realloc is : %p\n”,new_ptr); //print the 4 integers at the beginning printf(“4 integers at the beginning is:\n”); for (i=0;i<4;i++) { printf(“%d\n”,new_ptr[i]); } return 0;}运行结果如下:

从上面可以看出,在这个例子中新的空间并不是以原来的空间为基址分配的,而是重新分配了一个大的空间,然后将原来空间的内容拷贝到了新空间的开始部分,

3、三者的联系

calloc(n,size)就相当于malloc(n*size),而realloc(*ptr,size)中,如果ptr为NULL,那么realloc(*ptr,size)就相当于malloc(size)。

篇6:C语言字符串笔试题

对一个字符串重新排列,字母排在前面,数字排在后面,并不改变原来字母之间以及数字之间的字符顺序。

[cpp] view plain copy print?

#include

#include

#include

#define N 30

/

*函数名称: fun

*创建时间: 20xx.12.5

*描 述: 对一个字符串重新排列,字母排在前面,数字排在后面,并不改变原来字母之间以及数字之间的字符顺序。

*参 数: char * s,int *m

*返 回 值: chLetter(数组chLetter的首元素地址)

*局部变量: char chLetter[N];

* char chNumber[N];

* int i,j,k;

/

char * fun(char * s,int *m) //参数m是通过调试才想到的

{

char chLetter[N]; //用来存放字母

char chNumber[N]; //用来存放数字

int i,j,k;

i=0; //初始化

j=0; //j用来记录字母的个数

k=0; //k用来记录数字的个数

for (i=0; i

{

if (s[i] >= 'A' && s[i] <= 'Z' //将字母存入chLetter

|| s[i] >= 'a' && s[i] <= 'z')

{

chLetter[j]=s[i];

j++;

}

if (s[i] >= '0' && s[i] <='9') //将数字存入chNumber

{

chNumber[k]=s[i];

k++;

}

}

chLetter[j]='';

chNumber[k]='';

*m=j+k; //用来返回最后输入和输出时字符的个数

strcat(chLetter,chNumber);

return chLetter;

}

//主函数

void main

{

char s[N];

int i;

int m;

char *p;

p=NULL;

printf(“请输入字符串(30字符以内):n”);

scanf(“%s”,s);

p=fun(s,&m); //刚开始没定义出这个m来现限制指针p所指数组的长度就出现了后面两个字符乱码

for (i=0; i

{

s[i]=p[i];

}

printf(“结果为:”);

for (i=0; i

{

printf(“%c”,s[i]);

}

printf(“n”);

}

篇7:C语言字符串笔试题

将s所指字符串中最后一次出现的与t1所指字符串相同的子串替换为t2所指字符串。

[cpp] view plain copy print?

#include

#include

#include

#define N 30 //s所指字符串的最大长度

#define T 2 //t1和t2所指字符串的长度

/

*函数名称: fun

*创建时间: 20xx.12.5

*描 述: 将s所指字符串中最后一次出现的与t1所指字符串相同的子串替换为t2所指字符串

*参 数: char * s,char * t1, char * t2,int *m

*返 回 值: w(数组w的首元素地址)

*局部变量: char w[N];

* char temp[T];

* char t1temp[T];

* int i,j,k,l;

/

char * fun(char * s,char * t1, char * t2,int *m) //m的作用和第一题一样,没m最后两个字符会乱码(想寻求其他方法)

{

char w[N]; //用来存放处理后的字符串

char temp[T]; //用来存放从s所指字符串中截取的子串

char t1temp[T]; //用来存放t1所指字符串

int i,j,k,l;

//向t1temp中存入t1所指字符串

for (i=0; i

{

t1temp[i]=t1[i];

}

t1temp[T]='';

//求m所指的值

for (i=0;i

{

if (s[i]=='')

{

*m=i;

}

}

//寻找相同时的最后一个字符的下标

for (i=0; i

{

l=0;

for (j=i; j<(i+T); j++,l++) //截取长度为T的子串存到temp中

{

temp[l]=s[j];

}

temp[T]='';

if (strcmp(t1temp,temp) == 0)

{

k=i; //k记录相同时的最后一个字符的下标

}

}

for (i=0; i

{

j=0;

if (i>=k && i<(k+T)) //在找到的k点处开始换值

{

w[i]=t2[j]; //换值

j++;

}

else

{

w[i]=s[i];

}

}

return w;

}

//主函数

void main

{

char s[N];

char t1[T];

char t2[T];

int i;

int m;

char *p;

p=NULL;

printf(“请输入字符串(20字符以内):”);

scanf(“%s”,s);

printf(“请输入将要被替换的子字符串(仅限两个字符):”);

scanf(“%s”,t1);

printf(“请输入将要用来替换的字字符串(仅限两个字符):”);

scanf(“%s”,t2);

p=fun(s,t1,t2,&m);

for (i=0; i

{

s[i]=p[i];

}

printf(“结果为:”);

for (i=0; i

{

printf(“%c”,s[i]);

}

printf(“n”);

}

移动硬盘无法拷贝大文件故障的分析处理

只读内存

用函数简化你的字符串连接语句数据库教程

go语言实现字符串base64编码的方法

Python中处理字符串之endswith方法的使用简介

知识拷贝器作文

知识拷贝-叙事作文

按字节截取字符串

物理内存使用率高

内存频率知识介绍

《C语言 字符串的内存拷贝处理函数(共7篇).doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式

点击下载本文文档