Альтернативное решение для приложений, написанных на C11 или C ++ 11, заключается в использовании Unicode , сочетающего наложение длинных штрихов символа.
В C ++ 11 вы можете написать код примерно так:
#include <iostream>
#include <string>
std::string strikethrough(const std::string& text) {
std::string result;
for (auto ch : text) {
result.append(u8"\u0336");
result.push_back(ch);
}
return result;
}
int main() {
std::cout << strikethrough("strikethrough") << std::endl;
}
Код ставит префикс каждого символа на входе text
с наложением штрихов \u0336
. Обратите внимание, что функция предполагает, что text
кодируется в однобайтовой кодировке, такой как ASCII или Latin. Если входные данные находятся в UTF-8, они должны быть сначала преобразованы в UTF-32, чтобы получить границы символов.
В этом случае вывод будет s̶t̶r̶i̶k̶e̶t̶h̶r̶o̶u̶g̶h
в терминале с поддержкой UTF-8. Я не знаю, почему у первого персонажа нет зачеркнутого, должно быть, это конечная проблема. Я мог бы обойти это, напечатав хотя бы один символ перед зачеркнутым вызовом функции.
Решение Unicode также генерирует немного другую блокировку в моем терминале (terminator
) по сравнению с escape-последовательностью ANSI, упомянутой выше. Первый отображает строку точно в середине текста, а второй - немного ниже.