Перейти к содержимому

Как вывести обратный слэш в c

  • автор:

Символьные константы с обратным слэшем

Заключение символов в одинарные кавычки применимо для большинства печатаемых символов, но некоторые, как, например, возврат каретки, невозможно ввести с клавиатуры. С этой целью С использует специальные константы с обратным слэшем, показанные в таблице.

Таблица: Кодировка с обратным слэшем

Код Значение
\b Забой
\f Перевод формата
\n Новая строка
\r Возврат каретки
\t Горизонтальная табуляция
Двойная кавычка
\’ Одинарная кавычка
\0 Нулевой символ
\\ Обратный слэш
\v Вертикальная табуляция
\a Звонок
\N Восьмеричная константа (N — это восьмеричное значение)
\xN Шестнадцатеричная константа (N — это шестнадцатеричное значение)

Символы с обратным слэшем следует использовать таким же образом, как и обычные символы.

в результате первого присваивания переменная ch получает символ табуляции, после чего печатается строка «тестовая сторока» с переводом курсора на новую строку.

Как удалить экранируемый слэш из строки ?

В файле записаны спец символы типа: \n,\r,\t . Программа считывает эти строки. Но она их считывает типа: \\n,\\r,\\t . Как убрать лишний слэш, то есть преобразовать эти строки в спецсимволы. Пробовал так:

str = str.Replace(@"\\", @"\"); 

Но после такой замены ничего не меняется, длина строки выдает 2 вместо 1.

dibr0v72
18.09.20 17:13:14 MSK

Программа считывает эти строки. Но она их считывает типа

При такой постановке задачи могу посоветовать только сделать так чтобы она их считывала правильно.

Что мля ещё такое str? У std::string нет метода Replace. Что за нахрен @ ? Это не C++.

slovazap ★★★★★
( 18.09.20 17:21:09 MSK )
Последнее исправление: slovazap 18.09.20 17:22:46 MSK (всего исправлений: 1)

Записывай в файл нормально строки, чтобы они читались нормально.

Если этот файл писал другой инвалид, то напиши конвертер который будет заменять «\\n» на «\n» и т.д.

fsb4000 ★★★★★
( 18.09.20 17:37:24 MSK )
Последнее исправление: fsb4000 18.09.20 17:39:25 MSK (всего исправлений: 2)

Как вывести в строку знак : /

В общем пытаюсь сделать отчет и в отчете должны быть сырые данные *.bin битники (точнее где они лежат ) . Но выходной фаил *.txt обрабатывает LATEX и приводит к формату .rtf . Проблема заключается что битники лежат в файле MA_Check (название изменить нельзя) , и чтобы латех отобразил _ надо ввести /_ но в Qt это команда «строка коментов» . Что делать как быть .

char str[] = "Hello/World/"; size_t count = std::strlen(str); int j = 0; for (int i = 0; i j = j+1; qDebug() qDebug() else < str1[t] = str[i]; >// qDebug() else < str1[t] = str[i]; >> qDebug() setupUi(this); 

Отслеживать
5,198 18 18 серебряных знаков 40 40 бронзовых знаков
задан 24 ноя 2015 в 9:33
2,907 7 7 золотых знаков 44 44 серебряных знака 87 87 бронзовых знаков

первым делом — у вас в коде строка str1[t] = ‘\’; неверна, этот слеш используется для ввода спец символов. чтобы ввести именно его, нужно написать str1[t] = ‘\\’;

24 ноя 2015 в 9:36

К чему все эти манипуляции с символами? Если уж используете Qt , так пользуйтесь функционалом QString : QString::replace(const QString& before, const QString& after) .

24 ноя 2015 в 9:49

А вообще, не очень понятно что вам надо. Приведите пример двух строк: строка, которую вы имеете, и строка, которую вам надо получить.

24 ноя 2015 в 9:51

Ничего не понятно. Что у вас входной файл? Чем он обрабатывается сначала и что получается? Чем он обрабатывается потом, и что получается. Опишите проблему по шагам.

24 ноя 2015 в 16:43

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

У вас ошибка в этом месте:

if(str[i] == '_') < str1[t] = '\'; // ошибка здесь t = t+1; str1[t] = '/'; // здесь правильно >

В Си и Си++ символ \ внутри строковых и символьных литералов играет роль экранирующего. Это означает что следующий за ним символ воспринимается компилятором либо как символ форматирования, либо если это замыкающий символ литерала ( » для строковых и ‘ для символьных) как продолжение этого литерала. Во втором случае это нужно если необходимо в строке поместить кавычку » , например:

const char * str = "it is \"quoted\" string"; // it is "quoted" string 

То же самое если вам нужен символ ‘ char’у присвоить:

char quote = '\''; // quote = ' 

Если вам нужен сам символ \ то его тоже надо экранировать, то есть в литерале нужно писать \\ :

const char * path = "C:\\Program Files\\"; // C:\Program Files\ char slash = '\\'; // shash = \ 

У вас же происходит следующее: в сроке str1[t] = ‘\’; вы забыли заэкранировать обратный слеш и компилятор считает весь последующий код продолжением литерала который вы хотите присвоить str1[t] .

Правильно будет так:

if(str[i] == '_') < str1[t] = '\\'; // ок t = t+1; str1[t] = '/'; // ок >

Как вывести обратный слэш в c

Кавычки, ограничивающие строки с обеих сторон, служат для предотвращения интерпретации специальных символов, которые могут находиться в строке. (Символ называется «специальным», если он несет дополнительную смысловую нагрузку, например символ шаблона — * .)

bash$ ls -l [Vv]* bash$ ls -l '[Vv]*' ls: [Vv]*: No such file or directory 

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

bash$ grep '[Пп]ервая' *.txt file1.txt:Это первая строка в file1.txt. file2.txt:Это Первая строка в file2.txt. 

Примечательно, что "не окавыченный" вариант команды grep [Пп]ервая *.txt будет правильно исполняться в Bash, но не в tcsh.

Двойные кавычки могут быть использованы для предотвращения разбиения строки на слова. [2] Заключение строки в кавычки приводит к тому, что она передается как один аргумент, даже если она содержит пробельные символы - разделители.

variable1="a variable containing five words" COMMAND This is $variable1 # Исполнение COMMAND с 7 входными аргументами: # "This" "is" "a" "variable" "containing" "five" "words" COMMAND "This is $variable1" # Исполнение COMMAND с одним входным аргументом: # "This is a variable containing five words" variable2="" # Пустая переменная. COMMAND $variable2 $variable2 $variable2 # Исполнение COMMAND без аргументов. COMMAND "$variable2" "$variable2" "$variable2" # Исполнение COMMAND с 3 "пустыми" аргументами. COMMAND "$variable2 $variable2 $variable2" # Исполнение COMMAND с 1 аргументом (и 2 пробелами). # Спасибо S.C.

Заключение в кавычки аргументов команды echo необходимо только в том случае, когда разбиение на отдельные слова сопряжено с определенными трудностями.

Пример 5-1. Вывод "причудливых" переменных

#!/bin/bash # weirdvars.sh: Вывод "причудливых" переменных var="'(]\\<>\$\"" echo $var # '(]\<>$" echo "$var" # '(]\<>$" Никаких различий. echo IFS='\' echo $var # '(] <>$" \ символ-разделитель преобразован в пробел. echo "$var" # '(]\<>$" # Примеры выше предоставлены S.C. exit 0

Одиночные кавычки ( ' ' ) схожи по своему действию с двойными кавычками, только не допускают обращение к переменным, поскольку специальный символ "$" внутри одинарных кавычек воспринимается как обычный символ. Внутри одиночных кавычек, любой специальный символ, за исключением ' , интерпретируется как простой символ. Одиночные кавычки ( "строгие, или полные кавычки" ) следует рассматривать как более строгий вариант чем двойные кавычки ( "нестрогие, или неполные кавычки" ).

Поскольку внутри одиночных кавычек даже экранирующий ( \ ) символ воспринимается как обычный символ, попытка вывести одиночную кавычку внутри строки, ограниченной одинарными кавычками, не даст желаемого результата.

echo "Why can't I write 's between single quotes" echo # Обходной метод. echo 'Why can'\''t I write '"'"'s between single quotes' # |-------| |----------| |-----------------------| # Три строки, ограниченных одинарными кавычками, # и экранированные одиночные кавычки между ними. # Пример любезно предоставлен Stephane Chazelas.

Экранирование -- это способ заключения в кавычки одиночного символа. Экранирующий ( escape ) символ ( \ ) сообщает интерпретатору, что следующий за ним символ должен восприниматься как обычный символ.

С отдельными командами и утилитами, такими как echo и sed, экранирующий символ может применяться для получения обратного эффекта - когда обычные символы при экранировании приобретают специальное значение.

Специальное назначение некоторых экранированных символов

используемых совместно с echo и sed \n

перевод строки (новая строка)

ASCII-символ с кодом 0xx в восьмеричном виде)

Пример 5-2. Экранированные символы

#!/bin/bash # escaped.sh: экранированные символы echo; echo echo "\v\v\v\v" # Вывод последовательности символов \v\v\v\v. # Для вывода экранированных символов следует использовать ключ -e. echo "=============" echo "ВЕРТИКАЛЬНАЯ ТАБУЛЯЦИЯ" echo -e "\v\v\v\v" # Вывод 4-х вертикальных табуляций. echo "==============" echo "КАВЫЧКИ" echo -e "\042" # Выводит символ " (кавычки с восьмеричным кодом ASCII 42). echo "==============" # Конструкция $'\X' делает использование ключа -e необязательным. echo; echo "НОВАЯ СТРОКА И ЗВОНОК" echo $'\n' # Перевод строки. echo $'\a' # Звонок (сигнал). echo "===============" echo "КАВЫЧКИ" # Bash версии 2 и выше допускает использование конструкции $'\nnn'. # Обратите внимание: здесь под '\nnn' подразумевается восьмеричное значение. echo $'\t \042 \t' # Кавычки (") окруженные табуляцией. # В конструкции $'\xhhh' допускается использовать и шестнадцатеричные значения. echo $'\t \x22 \t' # Кавычки (") окруженные табуляцией. # Спасибо Greg Keraunen, за это примечание. # Ранние версии Bash допускали употребление конструкции в виде '\x022'. echo "===============" echo # Запись ASCII-символов в переменную. # ---------------------------------------- quote=$'\042' # запись символа " в переменную. echo "$quote Эта часть строки ограничена кавычками, $quote а эта -- нет." echo # Конкатенация ASCII-символов в переменную. triple_underline=$'\137\137\137' # 137 -- это восьмеричный код символа '_'. echo "$triple_underline ПОДЧЕРКИВАНИЕ $triple_underline" echo ABC=$'\101\102\103\010' # 101, 102, 103 это A, B и C соответственно. echo $ABC echo; echo escape=$'\033' # 033 -- восьмеричный код экранирующего символа. echo "\"escape\" выводится как $escape" # вывод отсутствует. echo; echo exit 0
echo "Привет" # Привет echo "Он сказал: \"Привет\"." # Он сказал: "Привет".

символ доллара (если за комбинацией символов \$ следует имя переменной, то она не будет разыменована)

echo "\$variable01" # выведет $variable01
echo "\\" # выведет \
# Простое экранирование и кавычки echo \z # z echo \\z # \z echo '\z' # \z echo '\\z' # \\z echo "\z" # \z echo "\\z" # \z # Подстановка команды echo `echo \z` # z echo `echo \\z` # z echo `echo \\\z` # \z echo `echo \\\\z` # \z echo `echo \\\\\\z` # \z echo `echo \\\\\\\z` # \\z echo `echo "\z"` # \z echo `echo "\\z"` # \z # Встроенный документ cat 

Отдельные символы в строке, которая записывается в переменную, могут быть экранированы, исключение составляет сам экранирующий символ.

variable=\ echo "$variable" # Не работает - дает сообщение об ошибке: # test.sh: : command not found # В "чистом" виде экранирующий (escape) символ не может быть записан в переменную. # # Фактически, в данном примере, происходит экранирование символа перевода строки #+ в результате получается такая команда: variable=echo "$variable" #+ ошибочное присваивание variable=\ 23skidoo echo "$variable" # 23skidoo # Здесь все в порядке, поскольку вторая строка #+ является нормальным, с точки зрения присваивания, выражением. variable=\ # \^ За escape-символом следует пробел echo "$variable" # пробел variable=\\ echo "$variable" # \ variable=\\\ echo "$variable" # Не работает - сообщение об ошибке: # test.sh: \: command not found # # Первый escape-символ экранирует второй, а третий оказывается неэкранированным, #+ результат тот же, что и в первом примере. variable=\\\\ echo "$variable" # \\ # Второй и четвертый escape-символы экранированы. # Это нормально.

Экранирование пробелов предотвращает разбиение списка аргументов командной строки на отдельные аргументы.

file_list="/bin/cat /bin/gzip /bin/more /usr/bin/less /usr/bin/emacs-20.7" # Список файлов как аргумент(ы) командной строки. # Добавить два файла в список и вывести список. ls -l /usr/X11R6/bin/xsetroot /sbin/dump $file_list echo "-------------------------------------------------------------------------" # Что произойдет, если экранировать пробелы в списке? ls -l /usr/X11R6/bin/xsetroot\ /sbin/dump\ $file_list # Ошибка: первые три файла будут "слиты" воедино # и переданы команде 'ls -l' как один аргумент # потому что два пробела, разделяющие аргументы (слова) -- экранированы.

Кроме того, escape -символ позволяет писать многострочные команды. Обычно, каждая команда занимает одну строку, но escape -символ позволяет экранировать символ перевода строки , в результате чего одна команда может занимать несколько строк.

(cd /source/directory && tar cf - . ) | \ (cd /dest/directory && tar xpvf -) # Команда копирования дерева каталогов. # Разбита на две строки для большей удобочитаемости. # Альтернативный вариант: tar cf - -C /source/directory . | tar xpvf - -C /dest/directory # См. примечание ниже. # (Спасибо Stephane Chazelas.)

Если строка сценария заканчивается символом создания конвейера | , то необходимость в применении символа \ , для экранирования перевода строки, отпадает. Тем не менее, считается хорошим тоном, всегда использовать символ "\" в конце промежуточных строк многострочных команд.

echo "foo bar" #foo #bar echo echo 'foo bar' # Никаких различий. #foo #bar echo echo foo\ bar # Перевод строки экранирован. #foobar echo echo "foo\ bar" # Внутри "нестрогих" кавычек символ "\" интерпретируется как экранирующий. #foobar echo echo 'foo\ bar' # В "строгих" кавычках обратный слэш воспринимается как обычный символ. #foo\ #bar # Примеры предложены Stephane Chazelas.

Примечания

Не менее любопытно поведение символа "\" , употребляемого внутри двойных кавычек.

bash$ echo hello\! hello! bash$ echo "hello\!" hello\! bash$ echo -e x\ty xty bash$ echo -e "x\ty" x y 

(Спасибо Wayne Pollock за пояснения.)

"Разбиение на слова" , в данном случае это означает разделение строки символов на некоторое число аргументов.

Назад К началу Вперед
Специальные типы переменных Наверх Завершение и код завершения

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *