Я бы использовал snprintf
(или asprintf
, если доступно), что-то вроде этого:
FILE* open_with_extension(const char* base, const char* name) {
const char* dotp = strrchr(name, '.');
if (dotp) {
char filename[MAX_PATH];
int sz = snprintf(filename, sizeof filename, "%s%s", base, dotp);
if (sz < sizeof filename) {
return fopen(filename, "wb");
}
else {
/* Name + extension too long */
return NULL;
}
}
else {
/* No extension, some kind of error? */
return NULL;
}
}
snprintf
и безопаснее, и проще, чем strcat
, и намного большегибкий.И это, вероятно, не намного медленнее, конечно, недостаточно для того, чтобы заметить в таких приложениях, как это.
Если вы выполняете более чем несколько последовательных strcat
вызовов для построения строки в квадратичном времени, вы можетедаже обнаружить, что snprintf
оказывается быстрее.Несмотря на это, он почти всегда более читабелен.