Ошибка типа "string subscript out of range"
моя часть кода делает проверку на путь ,который указывают для файла. В этом пути должны быть исключены все зарезервированные имена 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;
}
}
}
Ответы (1 шт):
Автор решения: AR Hovsepyan
→ Ссылка
Вот ваш код функции до строки, где комментарий // Работаем с именем :ъ
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("\\/");
По моему вы это хотели сделать многочисленными циклами и условиями. А теперь поймите как это работает, также "работайте с именем".