- Обрезать строку (удаление смежных пробелов в начале и конце строки). строку.
- Нормализовать смежные пробелы в середине строки до одного пробела.
- Вернуть константный символ* финального значения size как константа, поэтому двоичный файл будет содержать сокращенную строку, а не исходную строку.
Я использую Visual Studio C++ 2017.
В качестве примера:
Я хочу, чтобы это было в моем исходном коде (и только в моем исходном коде, а не в моем двоичном файле!):
Код: Выделить всё
R"SQL("
CREATE TABLE IF NOT EXISTS "MyTable" (
"ID" INTEGER NOT NULL,
"Field1" TEXT NOT NULL,
"Field2" TEXT,
PRIMARY KEY("ID")
)
)SQL"
Код: Выделить всё
CREATE TABLE IF NOT EXISTS "MyTable" ( "ID" INTEGER NOT NULL, "Field1" TEXT NOT NULL, "Field2" TEXT, PRIMARY KEY("ID"))
Код: Выделить всё
#include
#include
#include
constexpr bool is_whitespace(char c) {
return c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\f' || c == '\v';
}
template
constexpr std::size_t calculate_final_length(const char (&input)[N]) {
std::size_t start = 0;
std::size_t end = N - 1;
while (start < end && is_whitespace(input[start])) {
++start;
}
while (end > start && is_whitespace(input[end - 1])) {
--end;
}
std::size_t trimmed_length = end - start;
std::size_t final_length = 0;
bool in_whitespace = false;
for (std::size_t i = 0; i < trimmed_length; ++i) {
char c = input[start + i];
if (is_whitespace(c)) {
if (!in_whitespace) {
++final_length;
in_whitespace = true;
}
} else {
++final_length;
in_whitespace = false;
}
}
return final_length;
}
template
constexpr auto strip_string(const char (&input)[N]) {
constexpr std::size_t final_length = calculate_final_length(input); // Fails to turn it into constant
char result[final_length + 1] = {};
std::size_t out_index = 0;
bool in_whitespace = false;
// Calculer les indices de début et de fin après suppression des blancs
std::size_t start = 0;
std::size_t end = N - 1;
while (start < end && is_whitespace(input[start])) {
++start;
}
while (end > start && is_whitespace(input[end - 1])) {
--end;
}
// Calculer la longueur après trim
std::size_t trimmed_length = end - start;
// Remplir le tableau résultant avec les caractères traités
for (std::size_t i = 0; i < trimmed_length; ++i) {
char c = input[start + i];
if (is_whitespace(c)) {
if (!in_whitespace) {
result[out_index++] = ' ';
in_whitespace = true;
}
} else {
result[out_index++] = c;
in_whitespace = false;
}
}
result[out_index] = '\0';
return result;
}
constexpr const char raw_string[] = ;
constexpr auto test = strip_string(
R"( This is a RAW string test )");
int main() {
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/78543630/how-to-strip-a-string-given-as-a-const-char-through-a-constexpr-function[/url]
Мобильная версия