字符串操作之循环移位
2012-08-17 16:31
567 查看
该篇文章最主要是回顾c语言中字符数组,字符串和指针的处理以及数组越界问题的考虑。
memcpy() -- 拷贝内存内容
[/code]
在拷贝时,要考虑到"\0"字节,这个是字符串结尾字符。
[/code]
memcpy函数实现
[/code]
最后对数组越界问题附注说明:
字符数组和字符串的最明显区别是:字符串会被默认的加上结束符'\0' 。
1、字符数组的初始化要求:最后一个字符必须是'\0'。所以类似char c[2]={'a','b'}定义是错误的。但char p[]="ab"为正确的定义方式。
2、strlen函数:得到字符串除结束符'\0'外的长度。
问题描述
编写一个函数,把一个char'组成的字符串循环右移n位。比如原来是"abcdefghi",如果n=2,移位后应该是"hiabcdefgh"。问题分析
这个问题很简单,主要是看对c中标准库函数的掌握程度,这里主要可以采用两个库函数实现:strcpy和memcpy。这里主要对memcpy() -- 拷贝内存内容
表头文件: #include <string.h>
定义函数: void *memcpy(void *dest, const void *src, size_t n)
函数说明: memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束'\0'而结束。
返回值: 返回指向dest的指针
附加说明: 指针src和dest所指的内存区域不可重叠
strcpy()函数定义函数: void *memcpy(void *dest, const void *src, size_t n)
函数说明: memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束'\0'而结束。
返回值: 返回指向dest的指针
附加说明: 指针src和dest所指的内存区域不可重叠
原型:extern char *strcpy(char *dest,char *src);
用法:#include <string.h>
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。dest字符串的大小必须大于source字符串的大小,否则会访问越界。
一个经典的strcpy函数实现源码如下:用法:#include <string.h>
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。dest字符串的大小必须大于source字符串的大小,否则会访问越界。
[code] char *strcpy(char *strDest, const char *strSrc);
{
assert((strDest!=NULL) && (strSrc !=NULL));//对源地址和目的的非零断言
char *address = strDest;
while( (*strDest++ = * strSrc++) != ‘\0’ )
return address ; //为了实现链式操作,实现目的地址的返回
}
[/code]
在拷贝时,要考虑到"\0"字节,这个是字符串结尾字符。
函数实现
strcpy函数实现[code] void loopMove(char *pstr,int steps)
{
char temp[MAX_LEN];
int n = strlen(pstr) - steps; // 7
strcpy(temp,pstr+n); // temp:hi
strcpy(temp+steps,pstr); // temp:hiabcdefghi
printf("temp截断前%s\n",temp);
*(temp+strlen(pstr)) = '\0';
//printf("%d\n",strlen(temp));
printf("temp截断后%s\n",temp); // temp:hiabcdefg
strcpy(pstr,temp);
}
[/code]
memcpy函数实现
[code] void loopMove2(char *pstr,int steps)
{
int n = strlen(pstr) - steps;
char temp[MAX_LEN];
memcpy(temp,pstr+n,steps); // temp:hi
memcpy(pstr+steps,pstr,n); // pstr:ababcdefg
printf("%s\n",pstr);
memcpy(pstr,temp,steps); // temp:hiabcdefg
}
[/code]
最后对数组越界问题附注说明:
字符数组和字符串的最明显区别是:字符串会被默认的加上结束符'\0' 。
1、字符数组的初始化要求:最后一个字符必须是'\0'。所以类似char c[2]={'a','b'}定义是错误的。但char p[]="ab"为正确的定义方式。
2、strlen函数:得到字符串除结束符'\0'外的长度。
相关文章推荐
- 编程实现字符串的循环移位操作
- alg : 字符串按照字符进行循环移位(左旋转 or 右旋转)
- 使用移位操作把十进制转换为二进制与十六进制字符串输出
- 实现字符串右循环移位函数。
- 【程序员编程艺术】学习记录2:左旋转字符串之循环移位法
- 条件、循环、函数定义、字符串操作
- 字符串循环移位 编程之美3.1
- 判断一个给定的字符串通过循环移位是否可以包含另一个字符串
- 字符串循环移位包含
- 字符串循环移位
- (转)字符串循环移位
- 【算法】字符串循环移位后是否包含
- 字符串循环移位
- (1.5.2.12)字符串循环移位 编程之美3.1
- 条件、循环、函数定义、字符串操作练习
- 【C语言】字符串右循环移位
- C语言中关于字符串左右循环移位的问题
- 判断一个给定的字符串通过循环移位是否可以包含另一个字符串
- Java提高 - 字符串循环移位
- 字符串右循环移位