0

моя часть кода делает проверку на путь ,который указывают для файла. В этом пути должны быть исключены все зарезервированные имена Windows ( из серии con,clock$ и т.п. ) , в целом я был уверен, что написал правильную функцию, но после запуска стало выдавать ошибку "string subscript out of range" . Подскажите , пожалуйста, в чём моя ошибка.

bool CheckFile(string path) {
        int retry = 0, numbers, point = 0, miniNameSize = 0, numberPoints;
        int sizePath = size(path);
                    for (numberPoints = sizePath; numberPoints >= 0; numberPoints--) {
                    if (path[numberPoints] == '.') {
                    point = numberPoints;
                    break;
                    }
                    for (int k = 0; k < sizePath; k++) {
                    if (path[k] == '.' && k != point ) {
                    path.erase(k, 1);
                    k--;
                    }
                    sizePath = size(path);
                    }
                    for (int k = 0; k < sizePath; k++) {
                    if (path[k] == ' ') {
                    path.erase(k, 1);
                    k--;
                    }
                    }
                    sizePath = size(path);
            for (numbers = 0; numbers < sizePath; ) {
            if ((path[numbers] == '\\' || path[numbers] == '/') || numbers == 0) {
                for (int n = 1; (path[numbers + n] != '\\' || path[numbers + n] != '/' || path[numbers + n] != '.'); n++) miniNameSize = n;
                // Работаем с именем 
                if (miniNameSize == 0) numbers++;
                else {
                    if (numbers == 0) numbers--;
                    for (int j = numbers + 1 ; j <= miniNameSize; ) {                                           // Аккуратно с j !!!!
                        if (miniNameSize - j < 3) break;
                        else {
                            if (j + 3 == miniNameSize + 1) {
                                if ((path[j] == 'n' || path[j] == 'N') && (path[j + 1] == 'u' || path[j + 1] == 'U') && (path[j + 2] == 'l' || path[j + 2] == 'L')) retry++;
                                if ((path[j] == 'c' || path[j] == 'C') && (path[j + 1] == 'o' || path[j + 1] == 'O') && (path[j + 2] == 'n' || path[j + 2] == 'N')) retry++;
                                if ((path[j] == 'p' || path[j] == 'P') && (path[j + 1] == 'r' || path[j + 1] == 'R') && (path[j + 2] == 'n' || path[j + 2] == 'N')) retry++;
                                if ((path[j] == 'a' || path[j] == 'A') && (path[j + 1] == 'u' || path[j + 1] == 'U') && (path[j + 2] == 'x' || path[j + 2] == 'X')) retry++;
                            }
                            if (j + 4 == miniNameSize + 1) {
                                if ((path[j] == 'c' || path[j] == 'C') && (path[j + 1] == 'o' || path[j + 1] == 'O') && (path[j + 2] == 'm' || path[j + 2] == 'M') && (path[j+ 3] == '1' || path[j + 3] == '2' || path[j + 3] == '3' || path[j + 3] == '4')) retry++;
                                if ((path[j] == 'l' || path[j] == 'L') && (path[j + 1] == 'p' || path[j + 1] == 'P') && (path[j + 2] == 't' || path[j + 2] == 'T') && (path[j + 3] == '1' || path[j + 3] == '2' || path[j + 3] == '3')) retry++;
                            }
                            if (j + 6 == miniNameSize + 1) {
                                if ((path[j] == 'c' || path[j] == 'C') && (path[j + 1] == 'l' || path[j + 1] == 'L') && (path[j+ 2] == 'o' || path[j + 2] == 'O') && (path[j + 3] == 'c' || path[j + 3] == 'C') && (path[j + 4] == 'k' || path[j + 4] == 'K') && path[j + 5] == '$') retry++;
                        }
                    }
                    }

                }
            numbers = numbers + (miniNameSize + 1);
            miniNameSize = 0;

            }
        }
    }

Ku9feld
  • 37
  • 5
  • Ваша главная ошибка в том, что вы используете std::string, но работаете с ним как с обычным массивом, а ведь у него есть все подходящие методы, чтобы все это делать и безопасно и быстро и без головных болей и получать код намного компактней и понятней – AR Hovsepyan Dec 05 '20 at 12:51
  • О чем вы именно ? – Ku9feld Dec 05 '20 at 12:53
  • а выход за пределы происходит в условии for (int n = 1; <оно здесь> - там невооруженным глазом ее видно. Но даже после исправления этого, есть ряд ошибок - во первых там что то зацикливается, а во вторых, не видно возврата результата. Но в целом, сам код вызывает тревожность - алгоритм в нем потерялся – KoVadim Dec 05 '20 at 12:56
  • Что о чем? Вы используете С++ объект, но ваш код на чистом С. – AR Hovsepyan Dec 05 '20 at 12:56

1 Answers1

0

Вот ваш код функции до строки, где комментарий // Работаем с именем

const size_t sizePath = size(path),
    point = path.find_last_of('.');
if (point != path.npos) 
    path.erase(std::remove(path.begin(), path.begin() + point, '.'), path.end());
const size_t miniNameSize = path.find_first_of("\\/");

По моему вы это хотели сделать многочисленными циклами и условиями. А теперь поймите как это работает, также "работайте с именем".

AR Hovsepyan
  • 15,934