{ }codelper

学ぶ › C++

データ · 09

文字列

長さ・大文字・反転・一文字取り出し。

文字列は文字の並びです。
下の例は単語を1つ読み、長さ・大文字・逆にした文字列・最初の文字を順に表示します。

#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';}
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)
TypeScriptJavaScript と同じです
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()、反転は ToCharArray() で作った配列を Array.Reverse、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)

よくある間違い

韓国語の長さをバイトで数えたC · C++

strlen("한글")

→ 2 ではなく 6 — バイト数を数えます。UTF-8 では韓国語の一文字は3バイトです(C++ の std::string("한글").size() も 6)

C・C++ ではバイト数と文字数が違うことを覚えておきます。
Python・Java・C#・JavaScript・Craykon は 2 です。

文字列の一文字を書き換えたPython · JavaScript · TypeScript · Craykon

s = "abc"
s[0] = "x"

→ Python は TypeError、JavaScript はエラーなしで無視、TypeScript はコンパイルエラー、Craykon は「文字列は一文字ずつ変えられません」というエラー

新しい文字列を作ります。
例:Python "x" + s[1:]。

言語ごとの違い
文字列が等しいかを調べるとき、Java は == ではなく s.equals("yes") を使います(== は同じオブジェクトかを見るので、入力で受け取った yes と比べると false)。
C も == はアドレスの比較なので strcmp(a, b) == 0 を使い、Python・JavaScript・C#・C++(std::string)・Craykon は == で中身を比べます。

練習問題