C не распознает двойные кавычки в Mac OSX

Недавно мне поручили создать декомментатор программ на C для одного из моих занятий. Хотя это короткий и простой небольшой проект, я столкнулся с проблемой, которая стала серьезной головной болью. Программа работает на 100% нормально, за исключением того, что она не распознает кавычки на моем компьютере Mac. Однако мой профессор проверил его на своем компьютере с Linux, и он работал без проблем. Вот исходный код:

#include <stdio.h>

#define IN 0
#define OUT 1
#define QUOTE 2

int main(int argc, char** argv) {
    int state = OUT;
    int reader;
    while ((reader=getchar()) != EOF) {
        if (state==OUT) {
            if (reader=='\"') {
                state = QUOTE;
            }
            if (reader=='/') {
                if ((reader=getchar()) == '*') { state = IN; continue; }
                else putchar('/');
            }
            if (reader!=EOF) putchar(reader);
        } else if (state==QUOTE) {
            if (reader=='\"') state = OUT;
            putchar(reader);
        } else {
            if (reader=='*') {
                if ((reader=getchar()) == '/') state = OUT;
            }
        }
    }
    return 0;
}

Когда я ввожу следующий ввод (через перенаправление оболочки в терминале):

/* это тест */ это все еще тест « /* все еще тест */ »

/* «больше тестирования» */

Я получаю следующее в качестве вывода:

это все еще тест « »

Скорее, чем:

это все еще тест " /* все еще тест */ "

Я попытался протестировать следующий фрагмент кода, используя тот же ввод, но он ничего не напечатал:

int reader;
while ((reader=getchar()) != EOF) {
    if (reader=='\"') printf("true")
}

Я совершенно ошеломлен этим, но, возможно, кто-то здесь знает решение?


person Nick Dell'osa    schedule 19.02.2014    source источник
comment
Стилистическое примечание: вы можете избавиться от (большинства) вложенных if / else if s, используя switch(state) {} плюс continue;. Вы также можете добавить некоторые подсостояния для /* amd */   -  person wildplasser    schedule 19.02.2014
comment
Я бы просто собрал небольшой лексер для этого, используя GNU flex ... более гибкий (каламбур), а также с меньшей вероятностью сбоя, чем самодельные решения.   -  person Andreas Grapentin    schedule 19.02.2014
comment
Комментарии и строки в стиле C на самом деле довольно просто анализировать, поскольку они не могут быть вложенными. И для комментариев вам на самом деле не нужно хранить много состояния, просто вы находитесь в комментарии (для обнаружения вложенных комментариев), внутри комментария не может быть строковых литералов, поэтому вам не нужно проверять что.   -  person Some programmer dude    schedule 20.02.2014


Ответы (2)


Кавычки, которые вы вводите, заменены фигурными кавычками. Этого не должно происходить, когда вы вводите кавычки в терминале, поэтому я предполагаю, что вы создали текстовый файл с помощью какого-либо текстового редактора, а затем загрузили этот текстовый файл в свою программу. Если это так, то просто отредактируйте текстовый файл, отключите «умные кавычки» в «Системных настройках» -> «Клавиатура» -> «Текст», замените кавычки прямыми, а затем повторите попытку...

person jwatkins    schedule 19.02.2014

Итак, вы вводите в свою программу ЛЕВУЮ ДВОЙНУЮ КАВАЧКУ (") и ПРАВУЮ ДВОЙНУЮ КАВАЧКУ ("") вместо КАвыЧКИ (").

person Kuba hasn't forgotten Monica    schedule 19.02.2014