反转输入字符串时输出意外为空,可打印单个反转元素求技术帮助
解决C++字符串反转无输出的问题
我来帮你排查这个问题——你的代码里存在一个未定义行为的错误,这就是程序没有输出的核心原因。
问题根源
你定义的s2是默认构造的空字符串,它的初始长度为0。当你在循环里执行s2[a] = s1[n-1-a];时,实际上是在访问超出s2内存范围的非法位置,这属于越界访问内存的行为。这种情况下程序的结果是不可预测的:可能没有输出、直接崩溃,甚至偶尔看似“正常”但隐藏着严重隐患。你能单独打印单个字符只是巧合,不代表逻辑正确。
几种修复方案
方案1:预先为s2分配足够空间
在使用s2之前,先给它分配和s1相同的长度,确保每个索引位置都有合法的内存空间:
#include <iostream> #include <string> using namespace std; int main() { string s1; cin >> s1; int n = s1.size(); string s2(n, '\0'); // 初始化时指定长度为n,填充空字符 for(int a = 0; a < n; a++) { s2[a] = s1[n-1-a]; } cout << s2; }
也可以用resize方法来分配空间:
// ... 前面代码不变 string s2; s2.resize(n); // 调整s2的长度为n,分配对应内存 // ... 循环赋值逻辑不变
方案2:使用push_back动态添加字符
不需要预先分配空间,每次把反转后的字符添加到s2末尾,string会自动处理内存扩容:
#include <iostream> #include <string> using namespace std; int main() { string s1; cin >> s1; int n = s1.size(); string s2; for(int a = 0; a < n; a++) { s2.push_back(s1[n-1-a]); // 逐个添加字符到s2末尾 } cout << s2; }
方案3:直接使用标准库的reverse函数(最简洁高效)
C++标准库提供了现成的反转算法,包含<algorithm>头文件后直接调用即可,代码更简洁且性能更优:
#include <iostream> #include <string> #include <algorithm> // 必须包含这个头文件 using namespace std; int main() { string s1; cin >> s1; reverse(s1.begin(), s1.end()); // 直接反转s1本身 cout << s1; }
内容的提问来源于stack exchange,提问作者kp'
相关产品推荐
相关产品推荐

