2010-01-03 2 views
0

Прототип функции будет:Как преобразовать строку C/C++ с экранирующим символом на равнину (сырая) Строка

string f (string s); 

или

char* f (char* s); 

е трансформирует строку, представленную Printable ascii char в необработанную строку.

и было бы ведут себя, как в следующих примерах:

f("AAA") = "AAA" 
f("AA\n") = "AA+line_feed" 

т.е. входная является строкой 4 символа длиной (+ NULL), выход 3 символа длиной (+ NULL). В 2 печатные символы «\» «N» (в 2 последних символов входной строки) заменяются на один одиночный символ LF (ASCII 10)

f("\0x007") возвращает строку длины 1, содержащей символ ASCII 7

f("AA\nAA\tAA\07\n") преобразует все эти элементы escape-символа в их реальный (1 символ на escape-последовательность).

Это должно существовать, по крайней мере, в препроцессоре C-компилятора/C.

/C

+0

Это домашнее задание? что ты уже испробовал? – Glen

+2

Давай: попробуй, прежде чем задавать вопрос. Это просто чистая ленивость. –

+0

'NULL' - константа нулевого указателя. '' AAA "' не "4 char long +' NULL', это «строка» в C (последовательность символов с нулевым окончанием). 0 также является ASCII 'NUL', но ваше использование' NULL' в этом случае неверно. –

ответ

0

Ну, нет. Нет точки входа в стандартную библиотеку C или STL, которая просто делает это. Да, в реализациях cpp есть код. Вам потребуется в 20 раз больше времени, чтобы найти его, чтобы закодировать его самостоятельно.

3

Я думаю, что вы совершенно неправильно поняли, как работают escape-последовательности. Например, «AA \ n» - не «4 char long (+ NULL)« как вы предлагаете, это на самом деле именно то, что вы хотите - трехсимвольная строка. Компилятор предоставляет вам перевод, это не происходит во время выполнения.

Чтобы увидеть, что это верно, попробуйте следующее:

printf("%d\n", strlen("AA\n")) ; 

и вы будете наблюдать, что выход 3.

Теперь, если у вас есть строка во время выполнения, содержащих управляющие последовательности; например, буквальная строка «AA \ n», которая равна четыре символа, тогда нет никакой причины, чтобы стандартная библиотека предоставляла эту функциональность только потому, что компилятор выполняет такой перевод, какой вы думаете. Функциональность компилятора недоступна во время выполнения.

Реализация такого перевода сама по себе является тривиальной, например, вы можете просто сканировать строку при столкновении с «\», вы должны использовать следующий символ в качестве управляющей переменной конструкции коммутатора, чтобы выбрать, какой символ вставить в строку вывода , Если вы столкнулись с \ x или \ 0, вам нужно прочитать последующие шестнадцатеричные или восьмеричные цифры, чтобы определить вставляемый символ.

+0

Спасибо, что ответили ... Но мы согласны: Я знаю, что при вводе «AA \ n» в файл C CPP преобразует его в длинную строку длиной 3 символа. BUT Моя проблема в том, что программа, которую я пишу, читает эти строки из файла, как это делает CPP. Итак, когда я читаю «AAA \ n» (5 символов), я хочу функцию, которая преобразует \ n в ascii 10 (или любой другой символ escape) ... Я хочу делать то, что делает CPP! –

+0

Затем вы должны изменить заголовок и содержимое вопроса. Ваша строка ввода выглядит как «AA \\ n» ', и вы хотите, чтобы она была преобразована в« AA \ n ». Конечно, он по-прежнему чувствует себя как домашнее задание, поэтому покажи нам, что ты сделал до сих пор. –

+0

@ Christophe: И мой ответ называет это в двух последних абзацах. Мы можем согласиться, но ваш вопрос неоднозначен, поэтому я ответил на оба интерпретации. – Clifford

0

Это называется «unquoting» или «unescaping». Компилятор C обычно будет делать это как часть сканирования входного текста, поэтому вы вряд ли найдете такую ​​функцию в любом источнике компилятора C. Лучше всего написать простую функцию для сканирования по строке, заменяя экраны по мере ее хранения, сохраняя символы в выходной строке.

Смежные вопросы