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

【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)自己实现字符串比较函数(略)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_54429787/article/details/129429753