{ }codelper

学习 › Python

数据 · 09

字符串

长度、大写、反转、取出一个字符。

字符串是一排字符。
下面的例子读入一个单词,依次输出它的长度、大写形式、反转后的字符串和第一个字符。

s = input()print(len(s))print(s.upper())print(s[::-1])print(s[0])
stdin
hello
stdout
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 中判断字符串是否相等要用 s.equals("yes"),不能用 ==(== 比较的是不是同一个对象,拿输入读到的 yes 去比较会得到 false)。
C 的 == 也是比较地址,要用 strcmp(a, b) == 0;Python、JavaScript、C#、C++(std::string)和 Craykon 用 == 比较内容。

练习题