gpt4 book ai didi

c++ - 检查 char * 文件名的条件

转载 作者:行者123 更新时间:2023-11-28 07:46:13 25 4
gpt4 key购买 nike

我想给用户指定一个文件的选项(这里是ground_truth_filename)。如果他没有指定选项,我想对默认文件名进行假设。

但是,即使我在主程序中将其初始化为 0,我也无法检查 ground_truth_filenameNULL 还是零.如果参数由用户传递,我将 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)

最佳答案

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。

关于c++ - 检查 char * 文件名的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14838827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com