字符串和内存操作函数

本文详细介绍了C语言中字符串操作函数,如str与mem的区别、字符串初始化、取长度、复制、连接、比较、搜索及分割。同时,讨论了字符类型测试函数和字符串转换函数的使用,包括字符的ASCII值、结构体复制等知识点。
摘要由CSDN通过智能技术生成
 

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()来取代

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值