第24节 C语言中的字符串

------------------------------------资源来源于网络,仅供自学使用,如有侵权,联系我必删.

第一:

C 语言中的字符串
?  从概念上讲 ,C 语言中没有字符串数据类型
?  在C 语言中使用字符数组来模拟字符串
? C 语言中的字符串是以’\0’ 结束的字符数组
? C 语言中的字符串可以分配于栈空间 ,堆空间或者只读存储区

#include <stdio.h>
#include <malloc.h>

int main()
{
    char s1[] = {'H', 'e', 'l', 'l', 'o'};
    char s2[] = {'H', 'e', 'l', 'l', 'o', '\0'};
    //只读存取区
    char* s3 = "Hello"; //只读存取区的数据不能被改变                       
    //堆空间
    char* s4 = (char*)malloc(6*sizeof(char));  
	
    //正常
    s4[0] = 'H';
    s4[1] = 'e';
    s4[2] = 'l';
    s4[3] = 'l';
    s4[4] = 'o';
    s4[5] = '\0';
	
    free(s4);

    //错误
    s3[0] = 'h';//改变只读存取区的数据 
	
    return 0;
}

 

第二:

字符串长度

?  字符串的长度就是字符串所包含字符的个数
? C 语言中的字符串长度指的是第一个’\ 0’ 字符前出现的字符个数
? C 语言中通过’\0’结束符来确定字符串的长度

#include <stdio.h>
#include <assert.h>

size_t strlen(const char* s)
{
    size_t length = 0;
    
    //s不为空时开始计数
    assert(s);
    
    //当s='\0'时,停止计数
    while( *s++ )
    {
        length++;
    }
    
    return length;
}

int main()
{
    printf("%d\n", strlen("123456789"));
    
    return 0;
}

 

 

第二:

字符串长度

char* a = "123";
char* b = "1234";

if(strlen(a) >= stren(b))
{
    //........
}

if(strlen(a) - stren(b) >= 0)
{
    //........
}

 

strlen的返回值是用无符号数定义的,因此相减不可能产生负数 , 以上的语句不等价 。

 

使用一条语句实现strlen

#include <stdio.h>
#include <assert.h>

size_t strlen(const char* s)
{
    //assert(s)  参数s是否为空
    //strlen(s) <==> strlen(s+1) + 1
    //逗号表达式,递归函数,三目运算符
    return ( assert(s), (*s ? (strlen(s+1) + 1) : 0) );//递归
}

int main()
{
    printf("%d\n", strlen( NULL));
    
    return 0;
}

第三:

不受限制的字符串函数

不受限制的字符串函数是通过寻找字符串的结束符’\0’来判断长度

字符串复制: :
char* strcpy(char* dst, const char* src);
字符串连接: :
char* strcat(char* dst, const char* src);
字符串比较 :
int strcmp(const char* s1, const char* s2);

 

注意:

?  不受限制的字符串函数都是以‘\ 0’ 作为结尾标记来进行的 , 因此输入参数必须包含’\ 0’
? strcpy 和strcat 必须保证目标字符数组的剩余空间足以保存整个源字符串
? strcmp 以0 值表示两个字符串相等
    第一个字符串 大于 第二个字符串的时候返回值 大于
    第一个字符串 小于 第二个字符串的时候返回值 小于
? strcmp 不会修改参数值 , 但依然以’\ 0’作为结束符

 

实现库函数strcpy

#include <stdio.h>
#include <assert.h>

char* strcpy(char* dst, const char* src)
{
    char* ret = dst;
    
    //检测传入参数是否为空
    //如果其值为假(即为0),那么它先打印一条出错信息,然后终止程序运行
    assert(dst && src);
    
    //通过指针递增方式,实现拷贝函数功能,效率比下标实现高!!!
    while( (*dst++ = *src++) != '\0' );
    
    return ret;
}

int main()
{
    char dst[20];
    
    //strcpy()可以作为传入参数
    printf("%s\n", strcpy(dst, "xxxxx xxxxx!"));
    
    return 0;
}

 

 

第四:

长度受限的字符串函数

  长度受限的字符串函数接收一个显示的长度参数用于限定操作的字符数

字符串复制: :
char* strncpy(char* dst, const char* src, size_t len);
字符串连接: :
char* strncat(char* dst, const char* src , size_t len);
字符串比较 :
int strncmp(const char* s1, const char*s2 , size_t len);

 

注意:

? strncpy 只复制len 个字符到目标字符串
   当源字符串的长度小于len 时 , 剩余的空间以’\0’ 填充 。
   当源字符串的长度大于len 时 , 只有len 个字符会被复制 , 且它将不会以’\0’ 结束 。
? strncat 最多从源字符串中复制len 个字符到目标串中
  strncat 总是在结果字符串后面添加’\0’
  strncat 不会用’\0’ 填充目标串中的剩余空间
? strncmp 只比较len 个字符是否相等

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值