我想为用户提供指定一个文件的选项(此处为ground_truth_filename
)。如果他没有指定选项,我想对默认文件名做出假设。
但是,即使我在主程序中将其初始化为ground_truth_filename
,我也无法检查NULL
是0
还是零。如果参数由用户传递,我将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)
答案 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);
}