Как выйти из % (процент), входят в систему C printf?

PIC18

ответ PIC18, данный TK, приводит к следующим инструкциям (двоичный файл):

overflow
   PUSH
   0000 0000 0000 0101
   CALL overflow
   1110 1100 0000 0000
   0000 0000 0000 0000

Однако один только ВЫЗОВ выполнит переполнение стека:

CALL $
1110 1100 0000 0000
0000 0000 0000 0000

Меньший, более быстрый PIC18

, Но RCALL (относительный вызов) меньше все еще (не глобальная память, таким образом, никакая потребность в дополнительных 2 байтах):

RCALL $
1101 1000 0000 0000

, Таким образом, самой маленькой на PIC18 является единственная инструкция, 16 битов (два байта). Это взяло бы 2 командных цикла на цикл. В 4 тактах на командный цикл у Вас есть 8 тактов. PIC18 имеет 31 стопку уровня, поэтому после 32-го цикла, он переполнит стека в 256 тактах. На уровне 64 МГц Вы были бы переполнять стека за 4 микро секунды и 2 байта .

PIC16F5x (еще меньший и быстрее)

Однако серия PIC16F5x использует инструкции на 12 битов:

CALL $
1001 0000 0000

Снова, два командных цикла на цикл, 4 часов на инструкцию так 8 тактов на цикл.

Однако PIC16F5x имеет две стопки уровня, таким образом, на третьем цикле он переполнился бы в 24 инструкциях. На уровне 20 МГц это было бы переполнение за 1,2 микро секунды и 1,5 байта .

Intel 4004

Intel 4004 имеет инструкцию по подпрограмме вызова на 8 битов:

CALL $
0101 0000

Для любопытного, которое соответствует ASCII 'P'. С 3 стопками уровня, которые берут 24 такта для в общей сложности [1 123] 32,4 микро секунды и один байт . (Если Вы не разгоняетесь, Ваши 4004 - продвигаются, Вы знаете, что хотите.)

, Который является столь же маленьким как ответ befunge, но очень, намного быстрее, чем код befunge, работающий в текущих интерпретаторах.

266
задан nwellnhof 1 October 2017 в 02:29
поделиться

9 ответов

Вы можете избежать этого, разместив двойной "%", например: %%

Используя ваш пример:

printf("hello%%");

Экранирование знака "%" только для printf. Если вы это сделаете:

char a[5];
strcpy(a, "%%");
printf("This is a's value: %s\n", a);

Он напечатает: Это значение a: %%

406
ответ дан 23 November 2019 в 02:24
поделиться

Нитпик:
Вы действительно не избежите % в строке, определяющей формат для семейства функций printf () scanf () ).

% в семействе функций printf () scanf () ) запускает спецификацию преобразования. Одно из правил для спецификации преобразования гласит, что % в качестве спецификатора преобразования (сразу после % , который начал спецификацию преобразования) вызывает символ '%' должна быть записана без преобразования аргументов.

Строка на самом деле содержит 2 '%' символа внутри (в отличие от экранирующих символов: «a \ bc» ] - строка с 3 ненулевыми символами; "a %% b"

6
ответ дан 23 November 2019 в 02:24
поделиться

Сам с собой ...

printf("hello%%"); /* like this */
10
ответ дан 23 November 2019 в 02:24
поделиться

используйте двойной %%

6
ответ дан 23 November 2019 в 02:24
поделиться

Если нет форматы в строке, вы можете использовать put (или fputs ):

puts("hello%");

, если в строке есть формат:

printf("%.2f%%", 53.2);

Как указано в комментариях, Put добавляет \ n к выходу, а fputs - нет.

31
ответ дан 23 November 2019 в 02:24
поделиться

Вот так:

printf("hello%%");
//-----------^^ inside printf, use two percent signs together
4
ответ дан 23 November 2019 в 02:24
поделиться

Как говорили другие, %% будет экранировать%.

Обратите внимание, однако, что вы никогда не должны этого делать:

char c[100];
char *c2;
...
printf(c); /* OR */
printf(c2);

Всякий раз, когда вам нужно печатать строку, всегда, всегда , всегда печатайте его с использованием

printf("%s", c)

, чтобы встроенный% не вызывал проблем [нарушения памяти, segfault и т. д.]

36
ответ дан 23 November 2019 в 02:24
поделиться

Обратная косая черта в C используется для экранирования символов в строках. Строки не распознают% как специальный символ, и поэтому в экранировании нет необходимости. Printf - другое дело: используйте %% для вывода одного%.

3
ответ дан 23 November 2019 в 02:24
поделиться

Ага, используйте printf ("hello %%"); и готово.

2
ответ дан 23 November 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: