字符串操作函数和内存操作函数
函数名: strcpy
功 能: 将参数src字符串拷贝至参数dest所指的地址
用 法: char *strcpy(char *dest, constchar *src);
返回值: 返回参数dest的字符串起始地址
案例:
charstring[10];
char *str1 = "abcdefghi";
strcpy(string, str1);
如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况,在编写程序时需特别留意,或者用strncpy()来取代.
函数名: strncpy
功 能: 将字符串src前n个字符拷贝到字符串dest
用 法: char *strncpy(char *dest, constchar *src, size_t n);
返回值: 返回参数dest的字符串起始地址
说 明: 不像strcpy(),strncpy()不会向dest追加结束标记'\0';
src和dest所指的内存区域不能重叠,且dest必须有足够的空间放置n个字符;
程序例:
charstring[10];
char *str1 = "abcdefghi";
strncpy(string, str1, 3);
string[3] = '\0';
函数名: strcat
功 能: 字符串拼接函数
用 法: char *strcat(char *dest, constchar *src);
返回值: 返回dest字符串起始地址
说 明: strcat() 会将参数src字符串复制到参数dest所指的字符串尾部;
dest最后的结束字符'\0'会被覆盖掉,并在连接后的字符串的尾部再增加一个'\0';
dest与src所指的内存空间不能重叠,且dest要有足够的空间来容纳要复制的字符串;
程序例:
char destination[25];
char *blank = " ", *c = "C++", *Borland = "Borland";
strcpy(destination, Borland);
strcat(destination, blank);
strcat(destination, c);
函数名: strncat
功 能: 将n个字符追加到字符串的结尾
用 法: char *strncat(char *dest, constchar *src, size_t n);
返回值: 返回dest字符串起始地址
说 明: strncat()将会从字符串src的开头拷贝n个字符到dest字符串尾部,dest要有足够的空间来容纳要拷贝的字符串;
如果n大于字符串src的长度,那么仅将src全部追加到dest的尾部;
strncat()会将dest字符串最后的'\0'覆盖掉,字符追加完成后,再追加'\0';
程序例:
char url[100] = "http://blog.****.net";
char path[30] = "/cpp/u/string/";
strncat(url, path, 1000); // 1000远远超过path的长度
函数名: strcmp
功 能: 字符串比较, 区分大小写
用 法: intstrcmp(constchar *s1, constchar *s2);
返回值: 根据ASCII码比较,若参数s1和s2字符串相同则返回0,s1若大于s2则返回大于0的值,s1若小于s2则返回小于0的值
说 明: 它是区分大小写比较的,如果希望不区分大小写进行字符串比较,可以使用stricmp函数
程序例:
char *a = "aBcDeF";
char *b = "AbCdEf";
char *c = "aacdef";
char *d = "aBcDeF";
printf("strcmp(a, b) : %d\n", strcmp(a, b)); // 输出:1
printf("strcmp(a, c) : %d\n", strcmp(a, c)); // 输出:-1
printf("strcmp(a, d) : %d\n", strcmp(a, d)); // 输出:0
函数名: stricmp
原型:extern int stricmp(char*s1,char * s2);
用法:#include<string.h>
功能:比较字符串s1和s2,但不区分字母的大小写。
说明:strcmpi是到stricmp的宏定义,实际未提供此函数。
当s1<s2时,返回值<0
当s1=s2时,返回值=0
当s1>s2时,返回值>0
函数名: strchr
功 能: 查找字符串str中首次出现c字符的位置
用 法: char *strchr(constchar *str, int c);
返回值: 如果找到指定的字符则返回该字符所在地址,否则返回NULL
说 明: 返回的地址是字符串在内存中随机分配的地址
字符串str的结束标志‘\0’也会被纳入检索范围,所以str的最后一个字符也可以被定位;
如果希望查找某字符在字符串中最后一次出现的位置,可以使用strrchr() 函数;
程序例:
char *s = "0123456789012345678901234567890";
char *p;
p = strchr(s, '5');
printf("%sn", s); // 输出:0123456789012345678901234567890
printf("%s\n", p); // 输出:56789012345678901234567890
p = strrchr(s, '5');
printf("%s\n", p); // 输出:567890
函数名:strrchr
char *strrchr(const char *s, int c)
功能: 查找一个字符c在一个字符串s中最后一次出现的位置(也就是从s的右侧开始查找字符c首次出现的位置),并返回从字符串中的字符c所在的位置开始直到字符串s结束的所有字符。 若没有找到字符c,则返回NULL。
函数名: strstr
功 能: 检索子串在字符串中首次出现的位置
用 法: char *strstr( char *str, char * substr );
返回值: 返回字符串str中第一次出现子串substr的地址;如果没有检索到子串,则返回NULL
程序例:
char *str = "HelloWorldHelloWorld";
char *substr = "World";
char *s = strstr(str, substr);
printf("%s\n", s); // 输出:WorldHelloWorld
函数名: strlen
功 能: 计算指定的字符串s的长度,不包括结束字符'\0'
用 法: size_t strlen(constchar *s);
返回值: 返回字符串s的字符数
说 明: strlen() 函数计算的是字符串的实际长度,遇到第一个'\0'结束;
如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到'\0'停止;
sizeof返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen()是函数;
程序例:
char str[5] = "abcd";
strlen(str);
sizeof(str);
函数名: atoi
功 能: 将字符串转换成整数(int)
用 法: int atoi (constchar * str);
返回值: 返回转换后的整型数;如果str不能转换成int或者str为空字符串,那么将返回0
说 明: ANSI C规范定义了 stof()、atoi()、atol()、strtod()、strtol()、strtoul() 共6个可以将字符串转换为数字的函数,可以对比学习;
另外在C99/C++11规范中又新增了5个函数,分别是 atoll()、strtof()、strtold()、strtoll()、strtoull();
程序例:
char a[] = "-100";
char b[] = "456";
int c = 0;
c = atoi(a) + atoi(b);
● itoa():将整型值转换为字符串。
● ltoa():将长整型值转换为字符串。
● ultoa():将无符号长整型值转换为字符串。
● gcvt():将浮点型数转换为字符串,取四舍五入。
● ecvt():将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点。
● fcvt():指定位数为转换精度,其余同ecvt()。
● atof():将字符串转换为双精度浮点型值。
● atoi():将字符串转换为整型值。
● atol():将字符串转换为长整型值。
● strtod():将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字。
● strtol():将字符串转换为长整值,并报告不能被转换的所有剩余数字。
● strtoul():将字符串转换为无符号长整型值,并报告不能被转换的所有剩余数字。
函数名称:sprintf
头文件:stdio.h
函数功能:格式化字符串,将格式化的数据写入字符串中。
函数原型:int sprintf(char*buffer, const char *format, [argument]...)
函数返回值:buffer指向的字符串的长度;
程序例:
char buffer[10];
char *a = "1234";
char *b = "5678";
sprintf(buffer, "%s%s", a, b);
函数名:_access
头文件:<io.h>
函数原型:int _access(const char *pathname, int mode);
参数:pathname 为文件路径或目录路径 mode 为访问权限(在不同系统中可能用不能的宏定义重新定义)
返回值:如果文件具有指定的访问权限,则函数返回0;如果文件不存在或者不能访问指定的权限,则返回-1.
备注:当pathname为文件时,_access函数判断文件是否存在,并判断文件是否可以用mode值指定的模式进行访问。当pathname为目录时,_access只判断指定目录是否存在,在Windows NT和Windows 2000中,所有的目录都只有读写权限。
mode的值和含义如下所示:
00——只检查文件是否存在
02——写权限
04——读权限
06——读写权限
程序例:
if((_access("IsExist.txt",0)) = -1)
{ printf("FilesExist.txt exists.n");}
函数名:fopen
函数原型 FILE * fopen(const char *path,cost char *mode)
作用:打开一个文件,返回指向该文件的指针
参数说明:第一个参数为欲打开文件的文件路径及文件名,第二个参数表示对文件的打开方式
注:mode有以下值:
r:只读方式打开,文件必须存在
r+:可读写,必须存在
rb+:打开二进制文件,可以读写
rt+:打开文本文件,可读写
w:只写,文件存在则文件长度清0,文件不存在则建立该文件
w+:可读写,文件存在则文件长度清0,文件不存在则建立该文件
a:附加方式打开只写,不存在建立该文件,存在写入的数据加到文件尾,EOF符保留
a+:附加方式打开可读写,不存在建立该文件,存在写入的数据加到文件尾,EOF符不保留
wb:打开二进制文件,只写
wb+:打开或建立二进制文件,可读写
wt+:打开或建立文本文件,可读写
at+:打开文本文件,可读写,写的数据加在文本末尾
ab+:打开二进制文件,可读写,写的数据加在文件末尾
由mode字符可知,上述如r、w、a在其后都可以加一个b,表示以二进制形式打开文件
返回值:文件打开了,返回一个指向该打开文件的指针(FILE结构);文件打开失败,错误上存error code(错误代码)
注意:在fopen操作后要进行判断,是否文件打开,文件真正打开了才能进行后面的读或写操作,如有错误要进行错误处理
程序例:FILE *pfile=fopen(constchar *filename,"rb");
打开文件流还有一个支持宽字符的函数,如下
FILE *_wfopen(constwchar_t *filename,const wchar_t *mode)
函数名 fclose
函数原型:int fclose( FILE *fp );
fclose()函数用来关闭一个由fopen()函数打开的文件 。
使用方法例如: fclose( fp );
该函数返回一个整型数。当文件关闭成功时 返回0, 否则返回一个非零值。
一般在使用fclose之后都要判断是否关闭成功
函数名:fwrite
size_t fwrite(const void* buffer, size_tsize, size_t count, FILE* stream);
返回值:返回实际写入的数据块数目
(1)buffer:是一个指针,对fwrite来说,是要获取数据的地址;
(2)size:要写入内容的单字节数;
(3)count:要进行写入size字节的数据项的个数;
(4)stream:目标文件指针;
(5)返回实际写入的数据项个数count。
函数名:fread
函数原型
size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
buffer:用于接收数据的内存地址
size要读的每个数据项的字节数,单位是字节
count要读count个数据项,每个数据项size个字节.
stream输入流
返回真实读取的项数,若大于count则意味着产生了错误。另外,产生错误后,文件位置指示器是无法确定的。若其他stream或buffer为空指针,或在unicode模式中写入的字节数为奇数,此函数设置errno为EINVAL以及返回0.
函数名:fseek
int fseek(FILE *stream, long offset, intfromwhere);函数设置文件指针stream的位置。
头文件#include<stdio.h>
第一个参数stream为文件指针
第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移
第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
SEEK_SET:文件开头
SEEK_CUR:当前位置
SEEK_END:文件结尾
其中SEEK_SET,SEEK_CUR和SEEK_END依次为0,1和2.
简言之:
fseek(fp,100L,0);把stream指针移动到离文件开头100字节处;
fseek(fp,100L,1);把stream指针移动到离文件当前位置100字节处;
fseek(fp,-100L,2);把stream指针退回到离文件结尾100字节处。
内存操作函数
名称:memcpy
功能:拷贝内存空间
头文件:#include <stdlib.h>
函数原型:void *memcpy(void*dest, void *src, size_t n);
其中:dest为目标内存区,src为源内存区,n为需要拷贝的字节数
返回值:指向dest的指针
局限性:未考虑内存重叠情况
程序例:
char *strc="GoldenGlobal View";
char ds[20];
memcpy(ds,strc,strlen(strc)+1);
printf("ds =%s\n",ds); // 输出: Golden Global View长度不加1,结果为:Golden Global View烫烫烫烫烫TW?
printf("strc= %s\n",strc);// 输出:Golden Global View
区别
strcpy和memcpy主要有以下3方面的区别:
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
名称:memmove
功能:拷贝(移动)内存空间
头文件:#include <stdlib.h>
函数原型:void *memmove(void*dest, void *src, size_t n);
其中:dest为目标内存区,src为源内存区,n为需要拷贝的字节数
返回值:指向dest的指针
相比memcpy:当dest与src重叠时,仍能正确处理,但是src内容会被改变
名称:memset
功能:初始化指定内存空间
头文件:#include <stdlib.h>
函数原型:void *memset(void*buffer, int c, size_t n);
其中:buffer为分配的内存,c为初始化你内容,n为初始化的字节数
返回值:指向buffer的指针
特别注意:memset是按字节为单位对buffer指向的内存赋值
例:int a[5];
memset(a, 3, 5*sizeof(int)); //错误
上述情况下每个int元素被初始化为:00000011 00000011 00000011 00000011
memset(a, 0, 5*sizeof(int)); //正确,全部初始化为0
名称:memcmp
功能:比较两个内存空间的字符
头文件:#include <stdlib.h>
函数原型:int memcmp(constvoid *buf1, const void *buf2, size_t n);
其中:n为要比较的字符数
返回值:当buf1 > buf2时,返回 > 0;当buf1 = buf2时,返回 = 0;当buf1 < buf2时,返回 < 0。
区别:
对于memcmp(),如果两个字符串相同而且count大于字符串长度的话,memcmp不会在\0处停下来,会继续比较\0后面的内存单元,直到_res不为零或者达到count次数。
对于strncmp(),由于((__res= *cs - *ct++) != 0 || !*cs++)的存在,比较必定会在最短的字符串的末尾停下来,即使count还未为零。具体的例子:
char a1[]="ABCD";
char a2[]="ABCD";
对于memcmp(a1,a2,10),memcmp在两个字符串的\0之后继续比较
对于strncmp(a1,a2,10),strncmp在两个字符串的末尾停下,不再继续比较。
所以,如果想使用memcmp比较字符串,要保证count不能超过最短字符串的长度,否则结果有可能是错误的。
程序例:
char *a ="aBcDeF";
char *b ="AbCdEf";
char *c ="aacdef";
char *d ="aBcDeF";
printf("strcmp(a,b) : %d\n", strcmp(a, b)); // 输出:1
printf("strcmp(a,c) : %d\n", strcmp(a, c)); // 输出:-1
printf("strcmp(a,d) : %d\n", strcmp(a, d)); // 输出:0
printf("memcmp(a,d,10): %d\n", memcmp(a,d,10)); // 输出:0