Как преобразовать строку в символ в C - PullRequest
1 голос
/ 24 февраля 2010

Я пишу компилятор на C и мне нужно получить значение ASCII символа, определенного в файле исходного кода. Для обычных букв это просто, но есть ли способ преобразовать строку "\ n" в число ASCII для '\ n' в C (нужно работать со всеми символами)?

Приветствия

Ответы [ 4 ]

3 голосов
/ 24 февраля 2010

Если строка длиной в один символ, вы можете просто проиндексировать ее:

char *s = "\n";
int ascii = s[0];

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

Если, с другой стороны, у вас есть два символа, т.е.

char *s = "\\n";

тогда вы можете сделать что-то вроде этого:

char c;
c = s[0];
if (c == '\\') {
    c = s[1]; /* assume s is long enough */
    switch (c) {
        case 'n': return '\n'; break;
        case 't': return '\t'; break;
        ...
        default: return c;
    }
}

Выше предполагается, что ваш текущий компилятор знает, что означает '\n'. Если это не так, то вы все равно можете это сделать. Чтобы узнать, как это сделать, и увлекательную историю см. Размышления о доверии к доверию Кена Томпсона.

1 голос
/ 24 февраля 2010

Я пишу компилятор на C

Вероятно, не очень хорошая идея сделать это все в сыром C. Намного лучше использовать что-то вроде Bison для обработки начального анализа.

Тем не менее, лучший способ обработки \* побегов - просто иметь справочную таблицу того, во что превращается каждый побег.

0 голосов
/ 24 февраля 2010

Вам нужно будет реализовать это самостоятельно. Причина в том, что то, что вы делаете, определяется строковым литеральным синтаксисом языка, который вы компилируете ! (Тот факт, что ваш компилятор реализован на C, не имеет значения.)

Существуют условные escape-последовательности для литералов String, которые охватывают несколько языков; например \n обычно обозначает символ ASCII NewLine. Однако это не означает, что эти соглашения подходят для языка, который вы пытаетесь скомпилировать.

0 голосов
/ 24 февраля 2010

Вам нужно будет написать свой собственный парсер / конвертер. Список escape-последовательностей можно найти в Интернете во многих местах. Синтаксис синтаксиса в стиле C чрезвычайно сложен, поэтому вы также можете проверить существующие бесплатные реализации, такие как Clang .

...