Intereting Posts
C попытка разделить общий указатель Что означает n в `sscanf (s,”% d% n “, & i, & n)`? Две переменные с одинаковым именем и типом, в двух разных файлах .c, скомпилируются с gcc Печать наибольшего прайм-фактора композитного номера в C Как динамически выделять массив строк в C? Разница между char * argv и char ** argv для второго аргумента main () У двух перечислений есть некоторые общие элементы, почему это вызывает ошибку? Данные мусора, передаваемые в WiFi TCP-соединение с рабочего стола на Android Как использовать getch из проклятий без очистки экрана? GCC: разрешить перегруженные функции в C99 Выполняя вызов функции в C, является ли стек используемой ОС и является ли размер стека фиксированным? Передача выделенного C_PTR массиву Fortran в C Как скомпилировать исполняемый файл для Windows с GCC с подсистемой Linux? Получение адреса источника входящего сокета Не удалось загрузить файл или сборку Ошибка Microsoft.Data.OData Версия = 5.2.0.0 в роли рабочего агента Azure с использованием хранилища таблиц

Почему процентный символ не сбрасывается с помощью обратного слэша в C?

В документации 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  #include  #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"); 

вы правы. Плюс