Відповіді:
Ви можете уникнути цього, опублікувавши подвійний '%', як це: %%
Використовуючи свій приклад:
printf("hello%%");
Збіг знак "%" призначений лише для printf. Якщо ти зробиш:
char a[5];
strcpy(a, "%%");
printf("This is a's value: %s\n", a);
Він надрукує: This is a's value: %%
%
специфічний для printf
, правда?
\045
- це втеча з часу компіляції, що є частиною мови, і перетвориться %
при компіляції. printf
- це функція часу виконання, тому вона має справу з байтами рядка, а не з вихідним кодом C, і у нього є власні послідовності евакуації, які є частинами функції . Коротше кажучи, printf
це "мова всередині мови" і printf("This is a's value: %s\n", a);
дає такий же результат, як і printf("This is a's value: \045\0163\012", a);
.
printf("hello%c", '%');
. Однак %%
краще, оскільки він не використовує іншого аргументу.
Як говорили інші, %% втече від%.
Однак зауважте, що ніколи цього не слід робити:
char c[100];
char *c2;
...
printf(c); /* OR */
printf(c2);
Щоразу, коли вам доводиться друкувати рядок, завжди, завжди, друкуйте її за допомогою
printf("%s", c)
щоб запобігти появі проблем із вбудованим% (порушення пам'яті, segfault тощо)
Якщо в рядку немає форматів, ви можете використовувати puts
(або fputs
):
puts("hello%");
якщо в рядку є формат:
printf("%.2f%%", 53.2);
Як зазначається в коментарях, puts
додає a \n
до результату і fputs
не робить.
puts
. Я ніколи не думав puts
надрукувати струни і стрибав прямо на printf
. Більше не.
З самим собою ...
printf("hello%%"); /* like this */
Nitpick:
Ви дійсно не уникаєте %
рядка, що визначає формат для printf()
(та scanf()
) сімейства функцій.
%
, В printf()
(і scanf()
) сімейства функцій, починає специфікацію перетворення. Одне з правил специфікації конверсії зазначає, що %
як специфікатор перетворення (одразу після того %
, як розпочато специфікацію конверсії) викликає запис '%'
символу без аргументу, перетвореного.
У рядку дійсно є два '%'
символи (на відміну від бігових символів: "a\bc"
це рядок з 3 ненульовими символами; "a%%b"
це рядок з 4 ненульовими символами)
Зворотна косою рисою C використовується для виходу символів у рядках. Струни не визнавали б% особливим символом, і тому не потрібно було б уникнути. Printf - інша справа: використовуйте %% для друку одного%.
Ви можете використовувати %%:
printf("100%%");
Результат:
100%
ви використовуєте невірний специфікатор формату, який слід використовувати %%
для друку %
. Ваш код повинен бути:
printf("hello%%");
Детальніше все специфікатор формату , що використовуються в Сі .
Ви можете просто використовувати %
двічі, тобто"%%"
Приклад:
printf("You gave me 12.3 %% of profit");