字符串操作函数和内存操作函数

函数名: strcpy

  : 将参数src字符串拷贝至参数dest所指的地址

  : char *strcpy(char *dest, constchar *src);

返回值: 返回参数dest的字符串起始地址

案例:  

charstring[10];

char *str1 = "abcdefghi";

strcpy(string, str1);

 

如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况,在编写程序时需特别留意,或者用strncpy()来取代.

函数名: strncpy

扫描二维码关注公众号,回复: 1342683 查看本文章

  : 将字符串srcn个字符拷贝到字符串dest

  : char *strncpy(char *dest, constchar *src, size_t n);

返回值: 返回参数dest的字符串起始地址

  : 不像strcpy()strncpy()不会向dest追加结束标记'\0'

srcdest所指的内存区域不能重叠,且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'

destsrc所指的内存空间不能重叠,且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.csdn.net";

    char path[30] = "/cpp/u/string/";

strncat(url, path, 1000);  // 1000远远超过path的长度

 

函数名: strcmp

  : 字符串比较, 区分大小写

  : intstrcmp(constchar *s1, constchar *s2);

返回值: 根据ASCII码比较,若参数s1s2字符串相同则返回0s1若大于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>

功能:比较字符串s1s2但不区分字母的大小写

说明: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 NTWindows 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字符可知,上述如rwa在其后都可以加一个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);

返回值:返回实际写入的数据块数目

1buffer:是一个指针,对fwrite来说,是要获取数据的地址;

2size:要写入内容的单字节数;

3count:要进行写入size字节的数据项的个数;

4stream:目标文件指针

5)返回实际写入的数据项个数count

 

函数名:fread

函数原型

size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;

buffer:用于接收数据的内存地址

size要读的每个数据项的字节数,单位是字节

count要读count个数据项,每个数据项size个字节.

stream输入流

返回值

返回真实读取的项数,若大于count则意味着产生了错误。另外,产生错误后,文件位置指示器是无法确定的。若其他streambuffer为空指针,或在unicode模式中写入的字节数为奇数,此函数设置errnoEINVAL以及返回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_CURSEEK_END依次为012.

简言之:

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

区别

strcpymemcpy主要有以下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:当destsrc重叠时,仍能正确处理,但是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

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_26273523/article/details/80525896