Я хочу распечатать полиномиальное выражение в c, но не знаю, как вывести x в степени числа с printf
Я хотел бы напечатать верхний и нижний индекс с помощью printf, например x¹?
Ответы (3)
К сожалению, это далеко не тривиально. Вы не можете добиться того, чего хотите, с printf
. Вам нужно wprintf
. Кроме того, нетривиально переводить между нормальным и надстрочным индексом. Вам нужна такая функция:
wchar_t digit_to_superscript(int d) {
wchar_t table[] = { // Unicode values
0x2070,
0x00B9, // Note that 1, 2 and 3 does not follow the pattern
0x00B2, // That's because those three were common in various
0x00B3, // extended ascii tables. The rest did not exist
0x2074, // before unicode
0x2075,
0x2076,
0x2077,
0x2078,
0x2079,
};
return table[d];
}
Конечно, эту функцию можно изменить для обработки и других символов, если они поддерживаются. И вы также можете написать более полные функции, работающие с полными строками.
Но, как я уже сказал, это нетривиально, и это не может быть выполнено с помощью простых форматных строк до printf
и даже до wprintf
.
Вот несколько рабочий пример. Его можно использовать, но он очень короткий, потому что я пропустил все проверки на ошибки и тому подобное. Кратчайший возможный срок использования отрицательного числа с плавающей запятой в качестве экспоненты.
#include <wchar.h>
#include <locale.h>
wchar_t char_to_superscript(wchar_t c) {
wchar_t digit_table[] = {
0x2070, 0x00B9, 0x00B2, 0x00B3, 0x2074,
0x2075, 0x2076, 0x2077, 0x2078, 0x2079,
};
if(c >= '0' && c <= '9') return digit_table[c - '0'];
switch(c) {
case '.': return 0x22C5;
case '-': return 0x207B;
}
}
void number_to_superscript(wchar_t *dest, wchar_t *src) {
while(*src){
*dest = char_to_superscript(*src);
src++;
dest++;
}
dest++;
*dest = 0;
}
И основная функция для демонстрации:
int main(void) {
setlocale(LC_CTYPE, "");
double x = -3.5;
wchar_t wstr[100], a[100];
swprintf(a, 100, L"%f", x);
wprintf(L"Number as a string: %ls\n", a);
number_to_superscript(wstr, a);
wprintf(L"Number as exponent: x%ls\n", wstr);
}
Выход:
Number as a string: -3.500000
Number as exponent: x⁻³⋅⁵⁰⁰⁰⁰⁰
Чтобы сделать полноценный переводчик, вам понадобится что-то вроде этого:
size_t superscript_index(wchar_t c) {
// Code
}
wchar_t to_superscript(wchar_t c) {
static wchar_t huge_table[] {
// Long list of values
};
return huge_table[superscript_index(c)];
}
Помните, что это не может быть сделано для всех персонажей. Только те, чей аналог существует в виде надстрочной версии.
printf
не может обрабатывать Unicode»: Стандарт C не налагает таких ограничений. Типичные printf
реализации могут обрабатывать произвольные ненулевые коды, рассматривая их как необработанные двоичные файлы, помимо интерпретаций (для спецификаторов преобразования и т. Д.), Требуемых стандартом C, и поэтому не зависят от того, являются ли печатаемые данные ASCII, UTF-8 или что-то другое. И UTF-8 разработан, чтобы соответствовать этой модели, например, за счет того, что в его кодировках не используются байты, равные нулю или ASCII (старший бит равен нулю), за исключением, конечно, нулевого символа и символов ASCII.
- person Eric Postpischil; 01.02.2021
printf
вместо wprintf
?
- person klutt; 01.02.2021
К сожалению, вывести форматированный текст с printf
невозможно.
(Конечно, можно вывести формат HTML, но затем его нужно будет сначала передать в интерпретатор для правильного отображения)
Таким образом, вы не можете печатать текст в формате надстрочного текста в общем случае.
Вы обнаружили надстрочный индекс 1 как специальный символ. Однако это возможно только с 1 и 2, если я правильно помню (и только для правильной кодовой страницы, а не в простом ASCII).
Обычный способ печати надстрочных индексов - использовать синтаксис x^2
, x^3
. Это общепринято.
Альтернативой является ответ klutt. Если вы переключитесь на юникод, используя wprintf
вместо printf
, вы можете использовать все символы надстрочного индекса от 0 до 9. Хотя я не уверен, как многозначные экспоненты выглядят в терминале фиксированной ширины, это работает в принципе.
Если вы хотите напечатать надстрочный индекс 1, вам нужно использовать юникод. Вы можете комбинировать надстрочные символы Unicode, чтобы написать многозначное число.
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main() {
setlocale(LC_CTYPE, "");
wchar_t one = 0x00B9;
wchar_t two = 0x00B2;
wprintf(L"x%lc\n", one);
wprintf(L"x%lc%lc\n", one, two);
}
Выход:
$ clang ~/lab/unicode.c
$ ./a.out
x¹
x¹²
Ссылка: https://www.compart.com/en/unicode/U+00B9 < / а>
printf
не ограничивается ASCII и не требует его использования. Реализации C могут бесплатно поддерживать, например, UTF-8 или использовать EBCDIC. - person Eric Postpischil   schedule 01.02.2021