Документация printf()
гласит, что если кто-то хочет напечатать %
в C, он может использовать:
printf("%%")
Почему это не так:
printf("\%")
как с другими специальными символами?
Документация printf()
гласит, что если кто-то хочет напечатать %
в C, он может использовать:
printf("%%")
Почему это не так:
printf("\%")
как с другими специальными символами?
Поскольку %
обрабатывается printf
. Это не особый символ в C, но printf
сам относится к нему по-другому.
Обратная интерпретация обрабатывается компилятором при интерпретации исходного текста программы. Таким образом, общий результат заключается в том, что исходный текст "\%"
создает строку, содержащую "%".
Строка формата интерпретируется подпрограммой printf
, поэтому обрабатывает переданные ей символы. К этому времени обратная косая черта больше не присутствует, поэтому printf
ее никогда не видит.
Технически, \%
не является законным в строковом литерале. Символ \
запускает escape-последовательность, и единственные законные escape-последовательности перечислены в C 2011 6.4.4.4 1. Они \
, за которыми следуют '
, "
, ?
, \
, a
, b
, f
, n
, r
, t
, v
, от одной до трех восьмеричных цифр, x
и шестнадцатеричных цифр, u
и четырех шестнадцатеричных цифр, или u
и восемь шестнадцатеричных цифр.
Если printf
был спроектирован так, чтобы обратная косая черта сбежала от процента, тогда вам придется передать ему обратную косую черту, экранируя обратную косую черту в исходном тексте, поэтому вам нужно будет написать:
printf("\\%");
Соглашение состоит в том, что специальные символы уходят из себя. Таким образом, вместо того, чтобы использовать обратную косую черту, чтобы избежать процента, она ускользает. (Обратите внимание, что для передачи обратного слэша в printf
вам нужно написать строковый литерал как "\\%"
.)
Вы можете это сделать!!!!!
#include <iostream>
#include <string>
#include "stdio.h"
using namespace std;
int main(int argc, char **argv)
{
printf("hhhhhhh %s \n","\%");
printf("hhhhhhh \n");
return 0;
}
Проблема существует с printf и отличается от используемого вами компилятора. С помощью wxWidget lib вы не можете использовать printf с двумя escape-последовательностями
printf(" xxxxxx \0x81 xx \0x82 xx \n");
Не пойди. Но если вы используете
printf(" xxxxxx %s xx %s \n","\0x81","\0x82");
вы правы. Плюс