入门 · 字符串

反转字符串

读入一个单词,倒着打印出来。你第一次接触字符数组 —— C 风格字符串本质就是一个带了隐藏终止符的 char 数组。

一句话答案把单词读进 char 数组,用 strlen 取长度,然后从后往前逐个输出 —— C 字符串就是一个末尾藏着 '\0' 的 char 数组。

题目

输入: 一个单词(不含空格),最长 99 个字符。

输出: 同样的字符,倒序输出。

样例:

输入输出
helloolleh

你的解答

main.cpp — 你的解答
「运行我的输入」用的自定义输入

判题在浏览器本地运行。死循环会在 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;
}