如何不使用strlen函数反转并打印C字符串?
反转并打印C字符串的正确实现
原代码存在的问题
char backwards[];声明非法:C++不允许定义未指定大小且无初始化的数组,编译器会直接报错。forward[-i -1]索引错误:数组索引不能为负数,这会访问超出字符串范围的非法内存,触发未定义行为。- 未添加字符串终止符:即便成功填充数组,没有
'\0'的情况下,cout打印时会读取随机内存内容,导致乱码。
方案1:直接倒序打印(无需额外数组,高效简洁)
不需要创建新数组,先获取字符串长度,从最后一个有效字符开始倒序遍历打印即可:
#include <iostream> #include <cstring> // 用于strlen函数 void printBackwards(char forward[]) { // 获取字符串有效长度(不含终止符'\0') int len = strlen(forward); // 从最后一个字符开始倒序输出 for (int i = len - 1; i >= 0; --i) { std::cout << forward[i]; } std::cout << std::endl; // 可选:打印换行符 }
strlen(forward)会自动计算到'\0'之前的字符总数,无需手动计数。- 直接遍历打印避免了额外内存分配,是最优的实现方式。
方案2:先反转字符串再打印(需额外内存)
如果必须先生成反转后的字符串再打印,需要正确分配内存并添加终止符:
#include <iostream> #include <cstring> void printBackwards(char forward[]) { int len = strlen(forward); // 分配足够内存:len个字符 + 1个终止符的空间 char* backwards = new char[len + 1]; // 填充反转后的字符 for (int i = 0; i < len; ++i) { backwards[i] = forward[len - 1 - i]; } // 必须添加字符串终止符,否则打印会乱码 backwards[len] = '\0'; // 打印反转后的字符串 std::cout << backwards << std::endl; // 释放动态分配的内存,避免内存泄漏 delete[] backwards; }
内容的提问来源于stack exchange,提问作者ajcheng12
相关产品推荐
相关产品推荐

