检查char * filename的条件

时间:2013-02-12 18:02:21

标签: c++

我想为用户提供指定一个文件的选项(此处为ground_truth_filename)。如果他没有指定选项,我想对默认文件名做出假设。

但是,即使我在主程序中将其初始化为ground_truth_filename,我也无法检查NULL0还是零。如果参数由用户传递,我将ground_truth_filename分配给该参数。但是检查ground_truth_filename == 0给了我一个断言错误。

任何帮助将不胜感激。

int processFile(const char *filename, 
                YAML::Emitter &out_yaml, 
                char *ground_truth_filename)
{   
    std::cout << "Here" << std::endl;

    if (ground_truth_filename == 0)
        sprintf(ground_truth_filename,"%s.yaml",filename);        

    std::ifstream imgstrm(filename, std::ios::binary | std::ios::in);

    if (imgstrm.bad() || !imgstrm.is_open())
    {
        fprintf(stderr, "Failed to open file: %s\n", filename);
        return FILE_ERROR;
    }

    // get ground truth
    std::ifstream ground_truth_stream(ground_truth_filename);

    if (!ground_truth_stream.is_open()) 
    {
        fprintf(stderr, "Failed to open file: %s\n", ground_truth_filename);
        return FILE_ERROR;
    }
}

以下是调用函数的方法。也许我应该初始化ground_truth_filename ='\ 0'?

char *ground_truth_filename = 0;
for (int i = 1; i + 1 < argc; i += 2) {
            if (!strcmp(argv[i], "--snapshot-markup")) {
                ground_truth_filename = argv[i + 1];
                markupFlag = true;
            }
        }
processFile(filename, out_yaml, ground_truth_filename)

2 个答案:

答案 0 :(得分:1)

sprintf的第一个参数必须是指向足以容纳输出的缓冲区的指针。 NULL指针或指向较小字符缓冲区的指针(例如字符串文字“”)将导致崩溃。

可行的代码是:

char buf[256];

if (ground_truth_filename == NULL) {
   int charsneeded = snprintf(buf,sizeof(buf),"%s.yaml",filename);
   if (charsneeded >= sizeof(buf)) {
     return FILE_ERROR; // filename too long
   }
   ground_truth_filename = buf;
}

重点是,buf为新filename提供了一个存储在内存中的地方。字符串需要它。

编辑:添加了charsneeded的东西,以保护您免受太长的文件名作为安全措施。如果您确实需要它,请改为动态分配buf。

答案 1 :(得分:0)

您需要先分配ground_truth_filename,然后才能将字符复制到其中。

 if (ground_truth_filename == 0)
  {
    int length = strlen(filename) + strlen(".yaml") + 1;
    ground_truth_filename = new char[length];
    sprintf(ground_truth_filename,"%s.yaml",filename);   
  }