1. ホーム
  2. c++

[解決済み] C++の文字列を複数行に分割する (構文解析ではなくコード構文解析)

2023-07-22 04:36:42

質問

文字列をパースして賢く分割する方法と混同しないように、例.

C++で文字列を分割する?

c++で文字列を複数行に分割する方法について、私は少し混乱しています。

これは簡単な質問のように聞こえますが、次の例を見てください。

#include <iostream>
#include <string>
main() {
  //Gives error
  std::string my_val ="Hello world, this is an overly long string to have" +
    " on just one line";
  std::cout << "My Val is : " << my_val << std::endl;

  //Gives error
  std::string my_val ="Hello world, this is an overly long string to have" &
    " on just one line";  
  std::cout << "My Val is : " << my_val << std::endl;
}

を使うことができることに気づきました。 std::string append() メソッドを使用できることは理解していますが、読みやすさのために c++ の文字列を複数行に分割する、より短く、よりエレガントな(たとえば、明らかにトリプルクォートなどは c++ ではサポートされていませんが、より Python 的な)方法があるかどうか疑問に思っていました。

これが特に望ましい場所の1つは、関数に長い文字列リテラルを渡すときです (たとえば、文章)。

どのように解決するのですか?

文字列の間に何も入れないでください。 C++ の字句解析段階の一部は、隣接する文字列リテラルを (改行やコメントの上でも) 1 つのリテラルに結合することです。

#include <iostream>
#include <string>
main() {
  std::string my_val ="Hello world, this is an overly long string to have" 
    " on just one line";
  std::cout << "My Val is : " << my_val << std::endl;
}

もし、リテラルに改行を入れたい場合は、自分で追加しなければならないことに注意してください。

#include <iostream>
#include <string>
main() {
  std::string my_val ="This string gets displayed over\n" 
    "two lines when sent to cout.";
  std::cout << "My Val is : " << my_val << std::endl;
}

を混在させたい場合は #define dの整数定数をリテラルに混ぜる場合は、いくつかのマクロを使用する必要があります。

#include <iostream>
using namespace std;

#define TWO 2
#define XSTRINGIFY(s) #s
#define STRINGIFY(s) XSTRINGIFY(s)

int main(int argc, char* argv[])
{
    std::cout << "abc"   // Outputs "abc2DEF"
        STRINGIFY(TWO)
        "DEF" << endl;
    std::cout << "abc"   // Outputs "abcTWODEF"
        XSTRINGIFY(TWO) 
        "DEF" << endl;
}

stringify プロセッサの演算子の動作に起因する奇妙な点があるので、実際の TWO の実際の値を文字列リテラルにするために 2 つのレベルのマクロが必要です。