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

篇1:C语言 字符串的内存拷贝处理函数
对于字符串来说,我们运用字符串 C语言 字符串的内存拷贝处理函数
这个是
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
篇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判断字符串是否包含另外一个字符串
获取从某个字符所在位置开始的子串
${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
从上面可以看出,在这个例子中新的空间并不是以原来的空间为基址分配的,而是重新分配了一个大的空间,然后将原来空间的内容拷贝到了新空间的开始部分,
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”);
}
★只读内存
文档为doc格式