Я делаю подсветку синтаксиса и у меня проблемы с окраской текста между кавычками

0

У меня есть программа, итерация по строке, чтобы найти ". Если это так, запустите еще один цикл, который идет от конца строки, чтобы найти другую". Когда это произойдет, он проверяет, находится ли он в том же месте, что и первый итератор. Если это так, он вставляет строку "конец-текст-окраска", но если это не так, она вставляет строку "начало-текст-окраска". Я не уверен, что моя проблема лежит в моей логике или коде:/

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int getLength(string a) {
    return a.length();
}

int main () 
{
    string formStart = "\033[1;32m";
    string  formEnd = "\033[0m";
    string line;
    size_t pos;

    ifstream myFile ("opentest.cpp");

    if (myFile.is_open()) {
        while(getline(myFile,line)) {
            len = getLength(line);

            for (int i = 0; i < len; i++) {

                if (line[i] == '"') 
                    len = getLength(line);

                for (int n = len; n >= i; n--) {
                    if (line[n] == '"' && n == i) {
                        cout << "hit end" << endl;
                        line.insert(i, formEnd);
                    } else {
                        cout << "hit start" << endl;
                        line.insert(i, formStart);
                    }
                }
            }
        }

        cout << line << endl;   
        myFile.close();

    } else {
        cout << "Error" << endl;
    }
    return 0;
}
  • 0
    Код не имеет правильных соответствующих скобок.
  • 0
    Я не совсем понимаю, что вы имеете ввиду. Где?
Показать ещё 5 комментариев
Теги:

2 ответа

0
Лучший ответ

Спасибо вам за помощь. Я понял. Моя петля не ловила вторую ", потому что она вставляла строку формата перед первой. Вот мое решение, полное проверки завершения строки:

while(getline(myFile,line))
            {      
                    int placehold;
                    bool issecond = false;
                    len = getLength(line);
                    for (int i = 0; i < len; i++) {
                            if (line[i] == '"') {
                                    switch(issecond){
                                            case false:
                                                    line.insert(i, formStart);
                                                    issecond = true;
                                                    i += 8;
                                                    placehold = i;
                                                    break;
                                            case true:
                                                    line.insert((i+1), formEnd);
                                                    issecond = false;
                                                    i+=3;
                                                    break;
                                    }
                                    len = getLength(line);
                            }

                            if (i == (len-1) && issecond == true){
                                    line.insert(placehold, formEnd);
                                    issecond = false;
                            }
                    }




                    cout << line << endl;  
            }
0

Основываясь на вашем описании, if должно быть примерно так:

if (line[n] == '"')
{
    if (n == i) {
        cout << "hit end" << endl;
        line.insert(i, formEnd);
    } else {
        cout << "hit start" << endl;
        line.insert(i, formStart);
    }
}
  • 0
    Выполнение этого, кажется, помещает меня в бесконечный цикл.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню