我正在制作一种语法高亮显示,并且无法在引号之间对文本进行着色

时间:2014-11-07 06:03:30

标签: c++

我让程序遍历该行以找到“。如果确实如此,启动另一个for循环,从字符串的结尾开始查找另一个”。如果是,它将检查它是否与第一个迭代器位于同一位置。如果是,它将插入“end-text-coloration”行,但如果不是,则会插入“begin-text-coloration”行。我不确定我的问题是否在于我的逻辑或代码:/

#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;
}

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:0)

谢谢你所有的帮助。我想到了。我的循环没有赶上第二个&#34;因为它是在第一个之前插入格式字符串。这是我的解决方案,包括行终止检查:

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;  
            }