{ }codelper

学ぶ › C++

さらに先へ · 19

文字列の操作

切り出し、検索、置換、前後の空白除去、比較、桁そろえ。

入力を受け取ったら、まず整え(前後の空白を取る)、必要な部分を探して切り出し、形を変えて出力することがよくあります。
下の例はその道具を順に使います。

#include <iomanip>#include <iostream>#include <string> std::string trim(const std::string& s) {    size_t start = s.find_first_not_of(" \t\r\n");    if (start == std::string::npos) return "";    size_t end = s.find_last_not_of(" \t\r\n");    return s.substr(start, end - start + 1);} int main() {    std::string text, date, a, b, n;    std::getline(std::cin, text);    std::getline(std::cin, date);    std::cin >> a >> b >> n;    text = trim(text);    date = trim(date);    std::cout << '[' << text << "]\n";    std::cout << text.substr(0, 5) << '\n';    size_t i = text.find("World");    std::cout << i << '\n';    std::cout << text.substr(i, 5) << '\n';    size_t miss = text.find("Bye");    std::cout << (miss == std::string::npos ? -1 : (long)miss) << '\n';    for (size_t p; (p = date.find('-')) != std::string::npos;) date.replace(p, 1, "/");    std::cout << date << '\n';    int c = a.compare(b);    std::cout << (c > 0) - (c < 0) << '\n';    std::cout << std::setw(3) << std::setfill('0') << n << '\n';}
stdin
   Hello, World   
2026-11-10
pear apple
7
stdout
[Hello, World]
Hello
7
World
-1
2026/11/10
1
007

ポイント

  • 整えるとは前後の空白を取ることです。
    読んだ行は整えてから使うのが安全です。
  • 検索は最初に見つかった位置を返します。
    見つからないときはたいてい -1 ですが、言語によって違います。
  • 切り出しは二つ目の数の意味が言語ごとに違います。
    終わりの位置(その位置は含まない)の言語と、文字数の言語があります。
  • 置換はたいていすべて置き換えますが、JavaScript の replace は最初の一つだけです。
  • 比較は負・0・正を返します。
    信じてよいのは符号だけで、値の大きさに意味はありません。
  • 桁そろえは 7 を 007 のように前を埋めて幅をそろえます。

言語ごとの書き方

Pythonstrip()、find(なければ -1、index はエラー)、t[7:12](終わりの位置)、replace(すべて)、rjust(3, "0")
JavaScripttrim()、indexOf、slice(7, 12)(終わりの位置)、replace は最初の一つだけ・replaceAll はすべて、padStart(3, "0")。
localeCompare は言語設定に従います
TypeScriptJavaScript と同じです
Javastrip()、indexOf、substring(7, 12)(終わりの位置)、replace(すべて、replaceAll は正規表現)、compareTo(符号だけを信じる)
C#Trim()、IndexOf、Substring(7, 5)(文字数)、Replace(すべて)、PadLeft(3, '0')。
string.Compare と IndexOf(string) はカルチャに従うので、文字コードのまま比べるなら StringComparison.Ordinal か string.CompareOrdinal
C++整える関数がないので自分で切ります。
find(なければ std::string::npos)、substr(7, 5)(文字数)、compare。
全置換はループで。
桁そろえは setw と setfill
C整える・全置換がないので自分で書きます。
strstr(なければ NULL)、切り出しは printf("%.5s", text + 7)(開始アドレスと文字数)、比較は strcmp、桁そろえは printf("%03d")
Craykon空白除去()、位置検索(なければ -1)、切り出す(7, 5)(文字数)、置き換え(すべて)、前埋め(3, "0")

よくある間違い

compareTo が 1 を返すと思ったJava · C · C++ · C#

System.out.println("pear".compareTo("apple"));

→ 15 — 'p' - 'a' です

> 0、< 0 のように符号だけを見ます。

切り出しの二つ目の数を取り違えたC# · Java · JavaScript

"Hello, World".Substring(7, 12)  // C#
"Hello, World".substring(7, 5)   // Java, JavaScript

→ C# は範囲外エラー、Java もエラー。JavaScript は二つの数をこっそり入れ替えて ", " を返します

その言語で二つ目の数が終わりの位置か文字数か、先に確かめます。

replace ですべて置き換わると思ったJavaScript · TypeScript

console.log("2026-11-10".replace("-", "/"));

→ 2026/11-10 — 最初の一つだけが変わります

すべてなら replaceAll。
Java の replaceAll は正規表現なので "a.b".replaceAll(".", "-") が "---" になる点にも注意します。

言語ごとの違い
Windows で作った入力は行末が \r\n です。
Java nextLine()・C# ReadLine()・Craykon 行読み() は \r まで取りますが、Python input()(Linux・macOS 上)・JavaScript split("\n")・C fgets・C++ getline は残すので "World\r" == "World" が偽になります。
読んだ行は整えてから使いましょう。

練習問題