char* strlen()学习

本文通过一个C++示例程序详细介绍了如何使用char*类型进行字符串处理,包括手动初始化、字符串复制、输出以及释放内存等操作,并展示了如何正确地测量字符串长度及避免常见错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、char*数组自动初始化,为手动初始化时,获得strlen长度不是申请的的长度。

2、char*拷贝string时,会自动添加‘\0’。

int main()

{
int num =57;
char * str = new char[num];
int nnn=0;
cout<<"未初始化数组时strlen(str)为:"<<strlen(str)<<endl;

//memset(str,'\0',num);

str[num-1]='\0';

cout<<"未初始化数组时strlen(str)为:"<<strlen(str)<<endl;

strcpy(str,"We Are Happy.");
for (int i=0; i<num;i++)
{
if (str[i]=='\0')
{
cout<<"第"<<i<<"位输出为:88888"<<endl;
}else
{
cout<<"第"<<i<<"位输出为:"<<str[i]<<endl;
}
}
cout<<str;
delete []str;
return 0;
}
<think>我们首先需要实现一个符合C++标准的strcpy函数,然后讨论如何与之前实现的insert函数配合使用。注意:strcpy是标准库函数,在C++中我们应该避免自己实现,这里为了学习目的展示实现原理。1.strcpy的实现原理:函数原型:char*strcpy(char*dest,constchar*src);功能:将src指向的字符串(包括终止符'\0')复制到dest指向的位置,并返回dest。实现步骤:a.检查dest和src的有效性(避免空指针)。b.使用指针遍历src,逐个字符复制到dest,直到遇到src的结束符'\0'。c.在dest末尾添加结束符'\0'。2.自定义的insert函数(来自之前的实现):注意:我们之前的insert函数返回的是新分配的字符串,调用者需要负责释放内存。3.配合使用示例:我们可以先用strcpy将一个字符串复制到缓冲区,然后使用insert函数在缓冲区的指定位置插入另一个字符串。注意:insert函数会分配新内存,而strcpy要求目标缓冲区有足够的空间。然而,由于我们的insert函数是返回新分配的内存,而strcpy是直接复制到已有缓冲区,两者在使用方式上有所不同。因此,我们可以设计两种使用场景:a.在已知字符串s1的副本上进行修改:先使用strcpy将s1复制到足够大的缓冲区(该缓冲区预留了插入s2的空间),然后自己实现在缓冲区的指定位置插入s2(不使用自定义的insert函数,因为insert会分配新内存)。b.直接使用insert函数:这样更简单,但要注意内存管理。下面我们分别实现strcpy和回顾insert函数,并给出配合使用的示例。</think> ### C++ 字符串复制函数 `strcpy` 实现及与 `insert` 的配合 #### 1. `strcpy` 函数实现原理 `char *strcpy(char *dest, const char *src)` 实现源码如下: ```cpp char* strcpy(char* dest, const char* src) { if (dest == nullptr || src == nullptr) return nullptr; // 空指针检查 char* origin = dest; // 保存目标地址起始位置 while (*src != '\0') { // 复制源字符串内容 *dest++ = *src++; } *dest = '\0'; // 添加字符串终止符 return origin; // 返回目标字符串起始地址 } ``` ##### 关键技术分析: 1. **空指针检查**:保证程序健壮性 2. **指针算术**:通过自增运算符遍历字符 3. **终止符处理**:显式添加 `\0` 保证字符串完整性 4. **时间复杂度**:$$O(n)$$,其中 $$n = \text{strlen}(src)$$ 5. **内存要求**:`dest` 缓冲区必须足够大(至少 `strlen(src) + 1`) #### 2. `strcpy` 的典型用法 ```cpp #include <cstring> #include <iostream> int main() { char buffer[50]; const char* source = "Hello C++"; // 基础用法 strcpy(buffer, source); std::cout << buffer << std::endl; // 输出:Hello C++ // 链式调用 char buffer2[50]; std::cout << strcpy(buffer2, "Chain call") << std::endl; } ``` #### 3. 配合自定义 `insert` 函数使用 结合之前实现的插入函数(引用[2]相关内容): ```cpp // 插入函数声明 char* insert(const char* s1, const char* s2, int n); int main() { char base[100] = "Programming is fun"; // 目标缓冲区 const char* insertText = "C++ "; // 步骤1:使用strcpy初始化缓冲区 strcpy(base, "I love programming"); // 步骤2:在位置7插入"C++ " char* result = insert(base, insertText, 7); std::cout << result << std::endl; // 输出:I love C++ programming delete[] result; // 释放insert分配的内存 } ``` ##### 配合使用的关键技术: 1. **内存管理分层**: - `strcpy` 使用预分配缓冲区 - `insert` 动态分配新内存 2. **操作序列化**: ```mermaid graph LR A[初始化缓冲区] --> B[strcpy复制基础字符串] B --> C[insert执行插入操作] C --> D[使用结果] D --> E[释放insert分配的内存] ``` 3. **安全注意事项**: - `strcpy` 需确保目标缓冲区充足 - `insert` 结果需手动释放防止内存泄漏 - 推荐使用 `snprintf` 替代 `strcpy` 防止缓冲区溢出 #### 4. 进阶用法:组合字符串处理 ```cpp char* createGreeting(const char* name) { char buffer[100]; strcpy(buffer, "Hello, "); // 初始化基础字符串 strcat(buffer, name); // 拼接名称 strcat(buffer, "! Welcome to "); return insert(buffer, "C++ ", 15); // 在指定位置插入 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值