Как отловить ошибку с символьной строкой, не содержащей нулевого терминатора

0

У меня есть довольно простой код, прикрепленный ниже, где имя файла вводится вручную в программу и определяется как массив размером 9, что является правильным в этом примере. Имя файла передается функции, которая не включена здесь для краткости. Функция откроет файл в считанных данных как пять векторных строк и вернет их в основную программу, к которой к ним можно получить доступ с помощью арифметики указателя. Как я уже упоминал в этом случае, программа работает, но если я изменю размер файла 1 с 9 по 8, это не сработает, потому что нулевой ограничитель не учитывается. В духе того, чтобы сделать эту более безопасную программу, я хотел бы, чтобы программа распознавала условия, когда размер строки не включает нулевой ограничитель и пропускает вызов функции и все связанные с ней строки кода. Однако, когда нулевой терминатор не включен, код не вызывает ошибки, поэтому я не уверен, как использовать обработку исключений в этом экземпляре. Любые мысли были бы оценены.

#include <vector>
#include <iostream>
#include <fstream>

#include "Read_Columnar_File.h"

int main(int argc, const char * argv[]) {
    std::vector<std::string> str3;
    std::vector<int> str4;
    std::vector<char> str5;
    std::vector<int> str6;

    unsigned long size_Misc;
    float Peak_Misc_Value;
    std::vector<float> MISC_DATA; // Reads in Misc. spending data
    char File1[9];
    strcpy(File1, "Misc.txt");
    Read_Five_Columns(File1,MISC_DATA,str3,str4,str5,str6);
    str3.clear(); str4.clear(); str5.clear(); str6.clear();
    size_Misc = MISC_DATA.size();
    auto max_Misc = std::max_element(MISC_DATA.begin(), MISC_DATA.end());
    Peak_Misc_Value = *max_Misc;
}
  • 1
    В этой программе, во избежание ошибок, вы должны написать char File1[] = "Misc.txt";
Теги:
null-terminated

1 ответ

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

Рассмотрите возможность использования std :: string в качестве контейнера для вашего имени файла. Тогда File1.c_str() всегда должен иметь строку с нулевым завершением.

Если вы действительно хотите делать то, что пишете в цикле вопросов через массив File1, и проверять, является ли каждый символ "\ 0", если вы хотите, чтобы жало не было завершено. Я бы не рекомендовал использовать такой тип strcpy, поскольку он может выписывать границы вашего массива.

  • 0
    Это очень хорошее предложение, я все еще изучаю возможности стандартной библиотеки шаблонов и не понимаю, что в stl есть возможность работы со строками. Спасибо.

Ещё вопросы

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