字符串详解、常用API、sizeof和strlen区别、32,64位基本数据大小比较

师承clc

就是字符数组,虽然我不想这么说

定义的几种格式:

  1. 和整型一样,int data[ ] = {1,2,3,4,5};

2. 和整型数组一个道理,char str[ ] = {'h','e','l','l','0'};

3. 改进 ---char str[ ] = "hello";

4.一般用char *p =“hello”

  • 第三和第四的区别:

  • 3是字符串变量

  • 4是字符串常量--不予许被修改

5.注意指针的操作:

  • 保存地址可以--修改指向--指向字符串常量的地址空间

  • 对野指针的内存空间操作不行

和整型数组在存储上的区别

回忆如何计算数组的大小及数组元素的个数

字符数组的存储方式

多了结束标志‘\0’

sizeof和strlen的区别

编程案例

  • sizeof计算的是空间/地址大小,strlen计算的是有效数据长度

  • 无论什么指针类型,指针占几个字节跟语言无关,而是跟系统的寻址能力有关,他们地址大小都是一样的

  • strlen不会计算字符串后的‘\0’

  • 当写成“hello”,后面会有‘\0’

32位和64位操作系统基本数据类型字节大小

32位

char :1个字节
char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节

64位

char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 8个字节
long long: 8个字节
unsigned long: 8个字节

一些基本类型在32位及64位机上的大小差异

几种字符串常用的API

输出字符串

  • puts()

  • printf("%s",p);

获取字符串

1.scanf("%s",p)
2.gets
  • char * gets ( char * str );
注意

因为本函数gets()可以无限读取,易发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值

动态开辟字符串

  • malloc
  • 函数原型 void *malloc(size_t size)

  • C 库函数 void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针。

  • 注意

数组,普通的变量在栈开辟空间,在函数调用后会清理栈的数据,回收内存,而malloc在堆里开辟空间,堆只有程序结束后内存才会释放,如果是死循环不断malloc可能会耗尽计算机资源

  • realloc
  • 函数原型 void *realloc(void *ptr, size_t size)

  • 扩容

  • C 库函数 void *realloc(void *ptr, size_t size) 尝试重新调整之前调用 malloc 或 calloc 所分配的 ptr 所指向的内存块的大小。

  • 如果当前内存段后有足够的空间,realloc()返回原来的指针,如果当前内存段后没有足够的空间,realloc()返回一个新的内存段的指针:

  • free
  • C 库函数 void free(void *ptr) 释放之前调用 calloc、malloc 或 realloc 所分配的内存空间。

  • 释放,防止内存泄露

  • 防止悬挂指针,野指针的一种

  • memset
  • 函数原型 void *memset(void *str, int c, size_t n)

字符串分割

strtok
  • char *strtok(char *str, const char *delim)

  • 分解字符串 str 为一组字符串,delim 为分隔符

  • 特别要注意分割处理后原字符串 str 会变,原字符串的改动是切分符原位置均更改为 '\0'

示例代码

计算长度

strlen

用过太多啦,不多赘述

拷贝

  • strcpy
  • char *strcpy(char* dest, const char *src);

自己实现
  • strncpy
  • char *strncpy(char *dest, const char *src, int n)

  • 表示把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回被复制后的dest

自己实现

断言

  • assert

拼接

  • strcat
  • char *strcat(char *dest, const char *src);

  • 把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除*dest原来末尾的“\0”)。要保证*dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针。

自己实现

各大操作系统关于strcat的原码:https://www.cnblogs.com/elesos/archive/2012/11/08/2759790.html

比较

  • strcmp
  • int strcmp(const char *s1,const char *s2);

  • 若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数

自己实现
  • strncmp
  • int strncmp ( const char * str1, const char * str2, size_t n )

  • 功能是把 str1 和 str2 进行比较,最多比较前 n 个字节,若str1与str2的前n个字符相同,则返回0;若s1大于s2,则返回大于0的值;若s1 小于s2,则返回小于0的值。

自己实现

查找子字符

  • strchr
  • char *strchr(const char *str, int c)

  • 在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置

自己实现

查找子串

  • strstr
  • char *strstr(char *str1, const char *str2);

  • 返回值:若str2是str1的子串,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL

自己实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值