入门 · 字符串
反转字符串
读入一个单词,倒着打印出来。你第一次接触字符数组 —— C 风格字符串本质就是一个带了隐藏终止符的 char 数组。
一句话答案把单词读进 char 数组,用 strlen 取长度,然后从后往前逐个输出 —— C 字符串就是一个末尾藏着 '\0' 的 char 数组。
题目
输入: 一个单词(不含空格),最长 99 个字符。
输出: 同样的字符,倒序输出。
样例:
| 输入 | 输出 |
|---|---|
hello | olleh |
你的解答
「运行我的输入」用的自定义输入
判题在浏览器本地运行。死循环会在 3 秒后被自动中断 —— 但还是确保每个循环都有出口。代码随打随存。
卡住了?提示
提示 1 — char 数组 + strlen
char s[100]; cin >> s; 读一个单词。strlen(s) 给出长度,然后从 n-1 循环到 0。
提示 2 — 为什么停在终止符?
C 风格字符串以零字节结尾,函数靠它知道文本到哪里结束。
题解(先自己试试!)
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char s[100];
cin >> s;
int n = strlen(s);
for (int i = n - 1; i >= 0; i--) cout << s[i];
cout << endl;
return 0;
}
它是反转数字的数组版 —— 同样的思路,不同的数据类型。
深度解析
为什么这样做对
C 风格字符串是「数组 + 终止符」。用两个下标从两头往中间换,就是所有原地变换的原型。
代价
原地:O(n) 时间、O(1) 额外空间;另开数组拷贝:O(n) 额外空间。
常见错法
- 把 strlen 写在循环条件里,整个算法变成 O(n²)。长度先存一次。
- 忘了写终止符,或者把它覆盖掉,字符串尾部就是一堆垃圾。
下一步
同样的数组功底用在字符上:统计元音。
记住这两句
- 两个下标从两头逼近——原地反转的标准形态。
- 循环条件里的 strlen 是隐藏的 O(n²)。
🐞 这段是错的 —— 点开,亲手让它挂一次
正着打印了一遍,根本没反转
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char s[100];
cin >> s;
int n = strlen(s);
for (int i = 0; i < n; i++) cout << s[i];
cout << endl;
return 0;
}