C 语言字符串拷贝 ( 函数形参使用推荐方法 | 凡是涉及 修改指针指向 的操作一律创建新的 指针变量 执行 | 引入 辅助 局部 指针变量 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C 语言字符串拷贝 ( 函数形参使用推荐方法 | 凡是涉及 修改指针指向 的操作一律创建新的 指针变量 执行 | 引入 辅助 局部 指针变量 )相关的知识,希望对你有一定的参考价值。





一、函数形参使用推荐方法



在函数中 , 形参 中的 指针变量 , 不建议直接使用 ;

推荐 在 函数中 , 定义 局部 指针变量 , 接收 形参中的 指针变量 , 具体操作的是 函数中 定义的 局部指针变量 ;


直接使用 *to_tmp++ 样式的代码 , 会改变指针指向 , 有可能会导致错误 , 一旦出错 , 根本无法排查 ;

如果 将 数组首地址常量指针指针指向 进行修改 , 直接就报错了 ;


函数形参 的 值 , 不要轻易进行改变 , 因此一般函数的形参 , 都定义为 const char * 指针常量 类型 ;


引入 辅助 局部变量 , 接收 函数 形参变量 ;


凡是涉及 修改指针指向 的操作一律创建新的 指针变量 执行 ;


代码示例 :

/*
 * 实现字符串拷贝 ( 实现了模块化 )
 *      将 from 指针指向的字符串 拷贝到 to 指针指向的字符串换
 */
void str_copy(char *from, char *to)

    // 使用局部变量 接收 形参
    char *from_tmp = from;
    char *to_tmp = to;

    // 判断 参数中的 指针变量 不为空
    if(from_tmp == NULL || to_tmp == NULL)
    
        // 这两个指针有任何一个为空 , 都直接退出
        return;
    

    // 从 from 指针指向的字符 拷贝到
    //  to 指针指向的字符
    //  如果拷贝的值不是 \\0 , 则指针累加
    //  如果拷贝的值是 \\0
    // 这样就不需要额外拷贝 \\0 字符了
    while((*to_tmp++ = *from_tmp++));





二、完整代码示例



代码示例 :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
 * 实现字符串拷贝 ( 实现了模块化 )
 *      将 from 指针指向的字符串 拷贝到 to 指针指向的字符串换
 */
void str_copy(char *from, char *to)

    // 使用局部变量 接收 形参
    char *from_tmp = from;
    char *to_tmp = to;

    // 判断 参数中的 指针变量 不为空
    if(from_tmp == NULL || to_tmp == NULL)
    
        // 这两个指针有任何一个为空 , 都直接退出
        return;
    

    // 从 from 指针指向的字符 拷贝到
    //  to 指针指向的字符
    //  如果拷贝的值不是 \\0 , 则指针累加
    //  如果拷贝的值是 \\0
    // 这样就不需要额外拷贝 \\0 字符了
    while((*to_tmp++ = *from_tmp++));


int main()

    // 定义一个字符串数组
    // "Hello World!" 常量在 全局区 的常量区
    // 然后 拷贝到了 栈内存中的 array 数组中
    char array[] = "Hello World!";

    // 在栈内存中定义 char *指针
    // 在堆内存分配 20 字节内存 , 用于存放字符串
    char *buffer = malloc(20);

    // 调用字符串拷贝函数
    str_copy(array, buffer);

    // 打印拷贝结果
    printf("buffer = %s\\n", buffer);

    // 命令行不要退出
    system("pause");
    return 0;


执行结果 :

以上是关于C 语言字符串拷贝 ( 函数形参使用推荐方法 | 凡是涉及 修改指针指向 的操作一律创建新的 指针变量 执行 | 引入 辅助 局部 指针变量 )的主要内容,如果未能解决你的问题,请参考以下文章

C语言 memcpy 函数

C 语言字符串拷贝 ( 指针使用前判空 | while 空语句 )

C语言 strcpy 函数

C语言 strcpy_s 函数

【C 语言】数组元素和数组名作为函数参数

C 语言字符串模型 ( 字符串翻转模型 | 抽象成业务函数 | 形参返回值 | 函数返回值 | 函数形参处理 | 形参指针判空 )