数据 · 09
字符串
长度、大写、反转、取出一个字符。
字符串是一排字符。
下面的例子读入一个单词,依次输出它的长度、大写形式、反转后的字符串和第一个字符。
s = input()print(len(s))print(s.upper())print(s[::-1])print(s[0])const s = require("fs").readFileSync(0, "utf8").trim();console.log(s.length);console.log(s.toUpperCase());console.log([...s].reverse().join(""));console.log(s[0]);import { readFileSync } from "node:fs";const s: string = readFileSync(0, "utf8").trim();console.log(s.length);console.log(s.toUpperCase());console.log([...s].reverse().join(""));console.log(s[0]);import java.util.Scanner; public class Main { public static void main(String[] args) { String s = new Scanner(System.in).nextLine().trim(); System.out.println(s.length()); System.out.println(s.toUpperCase()); System.out.println(new StringBuilder(s).reverse()); System.out.println(s.charAt(0)); }}using System; class Program{ static void Main() { string s = Console.ReadLine().Trim(); Console.WriteLine(s.Length); Console.WriteLine(s.ToUpper()); char[] r = s.ToCharArray(); Array.Reverse(r); Console.WriteLine(new string(r)); Console.WriteLine(s[0]); }}#include <cctype>#include <iostream>#include <string> int main() { std::string s; std::cin >> s; std::cout << s.size() << '\n'; std::string up = s; for (char& c : up) c = std::toupper(static_cast<unsigned char>(c)); std::cout << up << '\n'; std::cout << std::string(s.rbegin(), s.rend()) << '\n'; std::cout << s[0] << '\n';}#include <ctype.h>#include <stdio.h>#include <string.h> int main(void) { char s[101]; scanf("%100s", s); int n = strlen(s); printf("%d\n", n); for (int i = 0; i < n; i++) putchar(toupper((unsigned char)s[i])); putchar('\n'); for (int i = n - 1; i >= 0; i--) putchar(s[i]); putchar('\n'); printf("%c\n", s[0]); return 0;}s = 控制台.读行();控制台.输出(s.长度);控制台.输出(s.大写());控制台.输出(s.反转());控制台.输出(s[0]);hello
5 HELLO olleh h
要点
- 下标从 0 开始。
第一个字符是s[0],最后一个字符的下标是长度 - 1。 - 长度、大写、反转、分割、去首尾空白这些工具每种语言都有,只是名字不同。
- 截取子串分成两派。
传结束下标的语言,对"abcdef"取(1, 3)得到"bc";传个数的语言得到"bcd"。 - 字符在内部是数字(字符编码):
A是 65,a是 97。
C、C++、Java、C# 的char本身就是数字,所以'A' + 1是66。 - 除了 C 和 C++,字符串都不能修改。
要改就另建一个新字符串。
各语言的写法
| Python | 长度 len(s),大写 s.upper(),反转 s[::-1],分割 s.split(),去空白 s.strip(),转数字 int(s),截取 s[1:3](结束下标),编码 ord("A") → 65、chr(97) → "a" |
|---|---|
| JavaScript | 长度 s.length,大写 s.toUpperCase(),反转 [...s].reverse().join("")(字符串没有 reverse),s.split(" "),s.trim(),截取 s.slice(1, 3)(结束下标),编码 s.charCodeAt(0)、String.fromCharCode(97) |
| TypeScript | 和 JavaScript 一样 |
| Java | 长度 s.length(),取一个字符用 s.charAt(i)(不是 s[i]),大写 s.toUpperCase(),反转 new StringBuilder(s).reverse(),s.split(" "),s.trim(),截取 s.substring(1, 3)(结束下标) |
| C# | 长度 s.Length,大写 s.ToUpper(),反转用 Array.Reverse 反转 ToCharArray() 得到的数组,s.Split(' '),s.Trim(),截取 s.Substring(1, 3)(个数)。把编码变回字符用 (char) |
| C++ | 长度 s.size()(或 s.length()),大写用 toupper 逐个字符转换,反转 std::string(s.rbegin(), s.rend()),截取 s.substr(1, 3)(个数) |
| C | 长度 strlen(s) — 每次都要扫到末尾的 \0。大写用 toupper 逐个字符转换,反转就从末尾逐个字符处理 |
| Craykon | 长度 s.长度,大写 s.大写()(小写 小写),反转 s.反转(),s.分割(" "),s.去空白(),转数字 s.转数字(),截取 s.截取(1, 3)(个数),编码 字符.编码("A")、字符.从编码(97) |
常见错误
修改字符串中的一个字符Python · JavaScript · TypeScript · Craykon
s = "abc"
s[0] = "x"→ Python 报 TypeError,JavaScript 不报错但被忽略,TypeScript 编译错误,Craykon 报“字符串不能逐个字符修改”的错误
另建一个新字符串,例如 Python "x" + s[1:]。
按字节数韩文长度C · C++
strlen("한글")→ 是 6 而不是 2 — 数的是字节。UTF-8 中一个韩文字符占 3 个字节(C++ 的 std::string("한글").size() 也是 6)
在 C 和 C++ 中要记住字节数和字符数不一样。
Python、Java、C#、JavaScript 和 Craykon 都是 2。
各语言的差异
在 Java 中判断字符串是否相等要用
C 的
在 Java 中判断字符串是否相等要用
s.equals("yes"),不能用 ==(== 比较的是不是同一个对象,拿输入读到的 yes 去比较会得到 false)。C 的
== 也是比较地址,要用 strcmp(a, b) == 0;Python、JavaScript、C#、C++(std::string)和 Craykon 用 == 比较内容。