OSDN Git Service

[Feature] 文字列を指定した文字数ごとに分割する関数
authorHabu <habu1010+github@gmail.com>
Thu, 29 Sep 2022 13:25:16 +0000 (22:25 +0900)
committerHabu <habu1010+github@gmail.com>
Thu, 29 Sep 2022 13:25:16 +0000 (22:25 +0900)
与えられた文字列を指定した文字数ごとに分割する関数 str_separate を追加する。
長いモンスター名などの折り返し表示などに使用することを想定。

src/util/string-processor.cpp
src/util/string-processor.h

index 154e94d..d126ab2 100644 (file)
@@ -701,6 +701,31 @@ std::vector<std::string> str_split(std::string_view str, char delim, bool trim,
 }
 
 /**
+ * @brief 文字列を指定した文字数で分割する
+ *
+ * 文字列 str を len で指定した文字数で分割し、分割した文字列を要素とする配列を
+ * std::vector<std::string> 型のオブジェクトとして返す。
+ * 全角文字は2文字分として扱い、全角文字の前半で分割されてしまわないように処理される。
+ *
+ * @param str 操作の対象とする文字列
+ * @param len 分割する文字数
+ * @return std::vector<std::string> 分割した文字列を要素とする配列
+ */
+std::vector<std::string> str_separate(std::string_view str, size_t len)
+{
+    std::vector<std::string> result;
+    std::vector<char> buf(len + 1);
+
+    while (!str.empty()) {
+        angband_strcpy(buf.data(), str.data(), buf.size());
+        result.emplace_back(buf.data());
+        str.remove_prefix(result.back().size());
+    }
+
+    return result;
+}
+
+/**
  * @brief 文字列から指定した文字を取り除く
  *
  * 文字列 str から文字列 erase_chars に含まれる文字をすべて削除し、
index 3cd66d9..cd200f2 100644 (file)
@@ -34,4 +34,5 @@ std::string str_trim(std::string_view str);
 std::string str_rtrim(std::string_view str);
 std::string str_ltrim(std::string_view str);
 std::vector<std::string> str_split(std::string_view str, char delim, bool trim = false, int num = 0);
+std::vector<std::string> str_separate(std::string_view str, size_t len);
 std::string str_erase(std::string str, std::string_view erase_chars);