【C语言敲重点(二)】字符串的那点小事儿

本文介绍了C语言中三种字符串声明方式的区别,包括字符数组、指向字符串常量的指针和字符串字面量。讨论了字符串的结束标志,以及动态内存管理函数。还提供了自己实现字符串拷贝函数`myStrcpy`和`myStrncpy`,以及字符拼接函数`myStrcat`的示例代码。
摘要由CSDN通过智能技术生成

【C语言敲重点(二)】字符串的那点小事儿

一、区分三种字符串声明的方式

(1)char str[ ] = {‘h’,‘e’,‘l’,‘l’,‘o’};
(2)char *str = “hello”;
(3)char str[ ] = “hello”;
  • 定义方式:(1)字符数组;(2)指向字符串常量的指针;(3)字符串字面量(字符串常量)

    (2)仅声明了一个指针变量指向字符串hello,而该字符串存放在常量区,不允许被修改

  • 一道小面试题:(D)
    在这里插入图片描述

  • 以下这种写法才是正确修改字符串的打开方式
    在这里插入图片描述

不同于上面的char *str = "Hello";char str[ ]=“Hello world"这种声明编译器会给数组在栈中分配内存空间,并将字符串存入数组的可修改地址中

二、字符串的必记的小点

  • 结束标志:‘\0’:sizeof( )值记得加上1;strlen( )计算的是字符串有效字符长度,'\0’忽略。
  • 动态开辟字符串:malloc( )、realloc( )、free( )。记得回收资源
  • 常用操作字符串函数:①拷贝strcpy( )\strncpy( );②拼接strcat( );③比较strcmp( );

三、常见面试题

(1)自己实现字符串拷贝函数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *myStrcpy(char *dest,const char *src){//const修饰,src不可变(加分)
    char *temp = dest;  //保存目标字符串,作为返回值,使函数可以作为其他函数的参数传入(加分)
    if(src == NULL || dest == NULL){    //NULL判断(加分)
        return NULL;            //写法有很多,选择容易理解的即可
    }
    while (*src != '\0'){
        *dest++ = *src++;
    }
    *dest = '\0';   //加上结束标志
    return temp;
}

char *myStrncpy(char *dest,const char *src,size_t size){//const修饰,src不可变(加分)
    char *temp = dest;  //保存目标字符串,作为返回值,使函数可以作为其他函数的参数传入(加分)
    if(src == NULL || dest == NULL){    //NULL判断(加分)
        return NULL;            //写法有很多,选择容易理解的即可
    }
    while (*src != '\0' && size-- > 0){
        *dest++ = *src++;
    }
    *dest = '\0';   //加上结束标志
    return temp;
}

int main(){
    char *str1 = "myStringCopy";
    char *str2 = (char *)malloc(strlen(str1));
    char *str3 = (char *)malloc(strlen(str1));
    myStrcpy(str2,str1);
    printf("%s\n",str2);
    printf("%s\n",myStrcpy(str2,str1)); //返回值的意义

    myStrncpy(str3,str1,8);
    puts(str3);
    return 0;
}

在这里插入图片描述

  • C语言断言函数assert( ):作用是计算表达式,如果为假,它会向标准错误stderr打印错误信息并调用abort终止程序,断言有一定的缺点就是频繁调用造成额外开销影响性能。
    在这里插入图片描述
(2)自己实现字符拼接函数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

char *myStrcat(char *dest,const char *src){
    char *temp = dest;
    assert(dest != NULL && src != NULL ); //断言
    char *destAppendPos = dest + strlen(dest);   //末尾地址
    while (*src != '\0'){
        *destAppendPos++ = *src++;
    }
    *destAppendPos = '\0';
    return temp;
}

int main(){
    char str1[] = "String1";
    char str2[] = "String2";
    myStrcat(str1,str2);
    printf("%s\n",str1);
    return 0;
}
(3)自己实现字符串比较函数(略)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AF_INET6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值