1.1 字符串操作函数说明
对一串字符的处理在应用编程中无处不在,其操作函数主要有两类:一类以str开头的函数,主要针对字符串进行处理;一类为mem开头的函数,针对一片内存进行处理,此类函数可以处理字符串和结构体。
1.1.1 字符串操作函数总结说明
1. str与mem的含义
str开头的函数为字符串函数,字符串函数遇到'\0'结束符即终止操作,字符串最后一个字符即为'\0'字符。
mem开头的函数为一片内存操作函数,函数原型中包括处理长度,表示对一片内存空间的处理,这片内存中可以包含'\0'字符。
2. 会对目的串自动补’\0’字符的函数
常见有strcpy、sprintf、gets、strcat等不指定长度的字符串函数。
3. strcpy与memcpy的比较
对strcpy、memcpy两函数差别说明如下:
① strcpy用于字符串的复制,strcpy碰到源串'\0'字符即终止复制。
② memcpy为一片内存空间的复制,复制时可以包括'\0'字符,一片内存空间或结构体变量之间的复制常用此函数。
③ strcpy(dest,src)表示把源字符串src复制到目的串dest中,当dest空间小于src长度时会造成内存溢出,从而让程序coredump。
④ memcpy (dest , src, n)表示复制src所指的内存内容前n个字节到dest所指的内存地址上。如果是字符串复制可以用strncpy代替,不过strncpy遇到'\0'字符会终止复制,可能复制不到n个字节。
⑤ 两结构体变量之间的复制只能用memcpy函数。
4. strcpy与strncpy的比较
对strcpy、strncpy两函数差别说明如下:
① 用strcpy函数复制时目的串后会自动补0,用strncpy函数复制时目的串后不会自动补0。
② strncpy(dest, src, n)表示从src源串复制n个字节到dest目的串,但碰到'\0'字符时会提前终止复制。
③ 用strncpy函数时,有时需要给目的串设置结束符('\0'),给一串字符设置'\0'的方式有两种,分别为string[n]=0或string[n]= '\0'。因为字符可以当做整型单独赋值,0表示ASCII编号的0;也可以当做字符赋值,字符赋值时特殊字符需用\来转义。字符'0'的ASCII编号为30,而字符'\0'的ASCII编号为0。
1.2 字符串函数操作
字符串函数是编程中常用到的函数,字符串按照使用用途可分为字符串初始化、取字符串长度、复制字符串、连接字符串、比较字符串、搜索字符串、分割字符串七大类。
1. 字符串初始化
(1)函数原型
memset(将一段内存空间填入某值) |
所需头文件 |
#include <string.h> |
函数说明 |
memset()会将参数s所指的内存区域前n个字节以参数c填入,然后返回指向s的指针。在编写程序时,若需要将某一数组作初始化,memset()会相当方便 |
函数原型 |
void * memset (void *s ,int c, size_t n) |
函数传入值 |
s:字符串地址 |
c:初始化字符 |
|
n:初始化字符串长度 |
|
函数返回值 |
返回指向s的指针 |
附加说明 |
参数c虽声明为int,但必须是unsigned char,所以范围在0到255之间 |
使用场合 |
① 初始化字符串 ② 初始化结构体 ③ 初始化malloc申请的内存空间 |
(2)memset函数说明
memset函数完成内存一片空间的初始化,对此函数使用方法说明如下:
① 字符串初始化:memset(string,0x00,sizeof(string)),string表示字符数组。
② 结构变量初始化:memset(&struct,0x00,sizeof(&struct)),struct表示结构变量。因为结构变量表示一片内存空间的抽象,需要用&得到结构变量地址。
③ 字符串和结构变量使用前最好用memset函数进行初始化。
(3)memset应用代码范例
memset.c代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char s[30];
char *p ;
struct stu
{
int num;
char name[20];
char sex;
float score;
};
struct stu boy1;
p=(char *)malloc(1024);
memset (s, 0x00, sizeof(s));
memset(p, 0x00, 1024) ;
memset(&boy1, 0x00, sizeof(struct stu)) ;
return 0 ;
}
2. 取字符串长度
(1)函数原型
strlen(返回字符串长度) |
所需头文件 |
#include <string.h> |
函数说明 |
strlen()用来计算指定的字符串s的长度,不包括结束字符’\0’ |
函数原型 |
size_t strlen (const char *s) |
函数传入值 |
s:字符串首地址 |
函数返回值 |
返回字符串s的字符数 |
(2)应用代码范例
strlen.c代码如下:
#include <stdio.h>
#include <string.h>
int main()
{
char *str = "12345678";
printf("str length = %d\n", strlen(str));
return 0 ;
}
编译 gcc strlen.c -o strlen。
执行 ./strlen,执行结果如下:
str length = 8
3. 复制字符串
(1)函数原型
strcpy(复制字符串) |
所需头文件 |
#include <string.h> |
函数说明 |
strcpy()会将参数src字符串复制至参数dest所指的地址 |
函数原型 |
char *strcpy(char *dest,const char *src) |
函数传入值 |
dest:目的串地址 |
src:源串地址 |
|
函数返回值 |
返回参数dest的字符串起始地址 |
附加说明 |
如果参数dest所指的内存空间不够大,可能会造成缓冲溢出(buffer Overflow)的错误情况,在编写程序时请特别留意,或者用strncpy()来取代 |