C语言<memory.h>和<string.h>头文件中的函数
C语言<memory.h>和<string.h>头文件中的函数
2014年9月29日
本文中的字符串,都是C风格(C-style)的字符串,即由char*指针指向的字符数组,所以请忽略代码部分中高亮的"string"关键字,它不是C++中的关键字。
-
strcpy
原型:extern char *strcpy(char * dest, char * src);
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
-
#include<stdio.h>
-
#include<string.h>
-
int main(void){
-
char string[10];
-
char*str1="abcdefghi";
-
strcpy(string,str1);
-
printf("%s\n",string);
-
return0;
-
}
- memcpy
原型:extern void *memcpy(void *dest, void *src, unsigned int count);
功能:由src所指内存区域复制count个字节到dest所指内存区域。
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。
memcpy会存在一个问题,就是如果出现dest是否与src重合,那么就内存的后半段就会被前半段复制过来的内容覆盖。事实上,编译器会对这种情况进行检测,并报错。而某些编译器,比如"gcc和VS会对这种情况直接调用memmove函数"(来源:http://bbs.csdn.net/topics/380234075)。举例如下:
-
#include <memory.h>
-
#include <string.h>
-
#include <stdio.h>
-
#include <stdlib.h>
-
-
int main(){
-
char *a = "abcdef";
-
// char *b = (char*)malloc(strlen(a));
-
char *b = a + 2;
-
printf("%s\n%s\n", a, b);
-
memcpy(b, a, strlen(a));
-
printf("%s\n%s\n", a, b);
-
// free(b);
-
return 0;
-
}
VC++下运行会产生运行时错误并崩溃。
-
memmove
原型:void *memmove( void* dest, const void* src, size_t count );
功能:由src所指内存区域复制count个字节到dest所指内存区域。
相关函数:memset、memcpy
-
memset
原型:extern void *memset(void *buffer, int c, int count);
功能:把buffer所指内存区域的前count个字节设置成字符c。
说明:返回指向buffer的指针。
-
strncpy
原型:char *strncpy(char *dest, char *src, size_t n);
功能:将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL才停止复制,而是等凑够n个字符才开始复制),返回指向dest的指针。
-
strcat
原型: char *strcat(char *destin, char *source);
功能: 字符串拼接函数
示例:
-
#include <memory.h>
-
#include <string.h>
-
#include <stdio.h>
-
#include <stdlib.h>
-
-
int main()
-
{
-
char destination[25];
-
char*blank=" ",*c="C++",*Borland="Borland";
-
strcpy(destination, Borland);
-
strcat(destination, blank);
-
strcat(destination, c);
-
printf("%s\n", destination);
-
return 0;
-
}
程序最终输出"Borland C++"
-
strchr
原型: char *strchr(char *str, char c);
功能: 在一个串中查找给定字符的第一个匹配处的指针
程序例:
-
int main(void)
-
{
-
char str [15];
-
char *ptr,c = 'r';
-
strcpy(str,"This is a string");
-
ptr = strchr(str,c);
-
if(ptr)
-
printf("The character %c is at position: %d\n", c, ptr - str);
-
else
-
printf("The character was not found\n");
-
return 0;
-
}
程序运行结果为"The character r is at position: 12"
-
strcmp
原型: int strcmp(char *str1, char *str2);
功能: 串比较
看ASCII码,str1>str2,返回值 > 0;两串相等,返回0
程序例:
-
int main(void)
-
{
-
char*buf1="aba",*buf2="abb",*buf3="abc";
-
int ptr;
-
ptr=strcmp(buf2,buf1);
-
if(ptr>0)
-
printf("buffer2 is greater than buffer1\n");
-
else
-
printf("buffer2 is less than buffer1\n");
-
ptr=strcmp(buf2,buf3);
-
if(ptr>0)
-
printf("buffer2 is greater than buffer3\n");
-
else
-
printf("buffer2 is less than buffer3\n");
-
return 0;
-
}
程序执行结果是:
buffer2 is greater than buffer1
buffer2 is less than buffer3
-
strlen
原型: size_t strlen(const char *s);
功能: strlen函数求的是字符串的长度,它求得方法是从字符串的首地址开始到遇到第一个'\0'停止计数,如果你只定义没有给它赋初值,这个结果是不定的,它会从字符串首地址一直记下去,直到遇到'\0'才会停止。
程序示例:
-
int main()
-
{
-
char *he= "Hello,world";
-
printf("字符串长度为%d\n",strlen(he));
-
return 0;
-
}
运行结果:
字符串长度为11
-
strdup
原型:char *strdup(char *str);
功能:将串拷贝到新建的位置处
程序示例:
-
int main(void)
-
{
-
char*dup_str,*string="abcde";
-
dup_str=strdup(string);
-
printf("%s\n",dup_str);
-
free(dup_str);
-
return 0;
-
}
程序运行结果为:"abcde"
-
strncmp
原型: int strncmp(char *str1, char *str2, int maxlen);
功能: 比较由前maxlen个字符构成的子串的大小。
程序例:
-
int main(void)
-
{
-
char*buf1="aaabbb",*buf2="bbbccc",*buf3="ccc";
-
int ptr;
-
-
ptr=strncmp(buf2,buf1,3);
-
-
if(ptr>0)
-
printf("buffer2 is greater than buffer1\n");
-
else
-
printf("buffer2 is less than buffer1\n");
-
-
ptr=strncmp(buf2,buf3,3);
-
-
if(ptr>0)
-
printf("buffer2 isgreater than buffer3\n");
-
else
-
printf("buffer2 is less than buffer3\n");
-
return 0;
-
}
程序执行结果是:
buffer2 is greater than buffer1
buffer2 is less than buffer3
-
strpbrk
原型: char *strpbrk(char *origin, char *charset);
功能: 在串中查找给定字符集中的字符,返回出现的第一个字符
程序例:
-
int main(void)
-
{
-
char* string1="abcdefghijklmnopqrstuvwxyz";
-
char* string2="onm";
-
char* ptr;
-
ptr=strpbrk(string1, string2);
-
if(ptr)
-
printf("strpbrk found first character: %c\n",*ptr);
-
else
-
printf("strpbrk didn't find character in set\n");
-
return 0;
-
}
程序运行结果为"strpbrk found first character: m"
-
strrchr
原型: char *strrchr(char *str, char c);
功能: 在串中查找指定字符的最后一次出现
-
strrev
原型: char *strrev(char *str);
功能: 串倒转,以'\0'为结束
程序示例:
-
int main(void)
-
{
-
char* forward= {"string"};
-
printf("Before strrev(): %s\n", forward);
-
char* reverse = strrev(strdup(forward));
-
printf("After strrev(): %s\n", reverse);
-
return 0;
-
}
注意,一定要使用strdup函数才能进行反转。
程序运行结果:
Before strrev(): string
After strrev(): gnirts
-
strstr
原型: char *strstr(char *str1, char *str2);
功能: 在串中查找指定字符串的第一次出现,返回指向第一次出现位置的指针。如果没找到则返回NULL。
程序示例:
-
int main(void)
-
{
-
char*str1="BorlandInternational", *str2="nation", *ptr;
-
ptr = strstr(str1,str2);
-
printf("Thesubstringis:%s\n",ptr);
-
return 0;
-
}
输出为:The sub string is: national
-
strtok
原型: char *strtok(char *str1, char *str2);
功能: 查找由在第二个串中指定的分界符分隔开的单词
程序示例:
-
int main(void)
-
{
-
char input[16]="abc,def";
-
char*p;
-
-
/*strtok places a NULL terminator
-
in front of the token,if found*/
-
-
p=strtok(input,",");
-
if(p)
-
printf("%s\n",p);
-
-
/*A second call to strtok using a NULL
-
as the first parameter returns a pointer
-
to the character following the token*/
-
-
p=strtok(NULL,",");
-
if(p)
-
printf("%s\n",p);
-
return 0;
-
}
程序输出结果:
abc
def
-
swab
原型: void swab (char *from, char *to, int nbytes);
功能: 交换字符串内相邻的两个字节,如果是偶数个字符,长度不变;如果是奇数个字符,则长度要减小1,因为最后一个字符和字符串结束标志'\0'做了交换。
程序示例:
-
char source1[15]="rFnakoBlrnad";
-
char source2[15]="rFnakoBlrna";
-
char target1[15] ,target2[15];
-
-
int main(void)
-
{
-
swab(source1, target1, strlen(source1));
-
printf("This is target:%s\n",target1);
-
swab(source2, target2, strlen(source2));
-
printf("This is target:%s\n",target2);
-
return 0;
-
}
程序输入结果:
This is target:FranoklBnrda
This is target:FranoklBnr