Символьные константы с обратным слэшем
Заключение символов в одинарные кавычки применимо для большинства печатаемых символов, но некоторые, как, например, возврат каретки, невозможно ввести с клавиатуры. С этой целью С использует специальные константы с обратным слэшем, показанные в таблице.
| Код | Значение |
|---|---|
| \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 за пояснения.)
"Разбиение на слова" , в данном случае это означает разделение строки символов на некоторое число аргументов.
| Назад | К началу | Вперед |
| Специальные типы переменных | Наверх | Завершение и код завершения |