Есть ли функция для печати строки, как в режиме экранирования? - PullRequest
0 голосов
/ 23 сентября 2011

То есть prt("a \t\n") должен печатать буквально "a \t\n",

есть ли какая-нибудь функция, которая это делает?

Ответы [ 5 ]

6 голосов
/ 23 сентября 2011

Glib имеет функцию g_strescape () , которая делает это. Если добавленная зависимость от glib не является для вас проблемой, по крайней мере.

6 голосов
/ 23 сентября 2011

Я предполагаю, что вы хотите экранировать специальные символы; то есть вы хотите напечатать \n вместо символа новой строки.

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

static char *escape_char(char *buf, const char *s) {
    switch (*s) {
        case '\n': return "\\n";
        case '\t': return "\\t";
        case '\'': return "\\\'";
        case '\"': return "\\\"";
        case '\\': return "\\\\";
        /* ... some more ... */
        default:
            buf[0] = *s;
            buf[1] = '\0';
            return buf;
    }
}

/* Warning: no safety checks -- buf MUST be long enough */
char *escape_string(char *buf, const char *s)
{
    char buf2[2];
    buf[0] = '\0';
    for (; *s != '\0'; s++) {
        strcat(buf, escape_char(buf2, s));
    }
    return buf;
}

Генерация тела функции также возможна, поскольку она может быть довольно утомительной и повторяющейся.

Вот как вы можете это проверить:

int main()
{
    const char *orig = "Hello,\t\"baby\"\nIt\'s me.";
    char escaped[100];
    puts(orig);
    puts(escape_string(escaped, orig));
    return 0;
}
4 голосов
/ 23 сентября 2011

Нет, потому что строковые литералы уже "неэкранированы" во время синтаксического анализа исходного кода, поэтому компилятор никогда не видит литеральные обратные косые черты или кавычки. Тебе просто нужно избежать обратной косой черты: "\"a \\t\\n\"".

В качестве альтернативы вы можете взять заданную строку, выполнить поиск и заменить все вхождения управляющих символов их escape-последовательностью.

1 голос
/ 23 сентября 2011

Вы должны избежать обратной косой черты и кавычки с обратной косой чертой:

printf( "\"a \\t\\n\"" );
0 голосов
/ 23 сентября 2011

Нет функции как таковой, но вы всегда можете

printf("a \\t\\n");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...