У меня есть программа, итерация по строке, чтобы найти ". Если это так, запустите еще один цикл, который идет от конца строки, чтобы найти другую". Когда это произойдет, он проверяет, находится ли он в том же месте, что и первый итератор. Если это так, он вставляет строку "конец-текст-окраска", но если это не так, она вставляет строку "начало-текст-окраска". Я не уверен, что моя проблема лежит в моей логике или коде:/
#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;
}
Спасибо вам за помощь. Я понял. Моя петля не ловила вторую ", потому что она вставляла строку формата перед первой. Вот мое решение, полное проверки завершения строки:
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;
}
Основываясь на вашем описании, if
должно быть примерно так:
if (line[n] == '"')
{
if (n == i) {
cout << "hit end" << endl;
line.insert(i, formEnd);
} else {
cout << "hit start" << endl;
line.insert(i, formStart);
}
}