Итак, если он вернет 80, то строка заполнит буфер и не будет завершена как \0
Это неверно: строка будет нулевойпрекращено независимо от того, что вы принимаете за file_path
.Очевидно, что строка будет обрезана в sizeof(buf)-1
.
Обратите внимание, что snprintf
также может вернуть число выше 80.Это будет означать, что строка, которую вы хотите напечатать, длиннее, чем предоставленный вами буфер.
Каков наилучший способ предотвратить это?
Вы уже делаетеэто: assert
не является необходимым для предотвращения неопределенных строк.Вы можете использовать возвращаемое значение, чтобы решить, произошло ли какое-либо усечение, и передать больший буфер для компенсации:
// Figure out the size
size_t n = snprintf(NULL, 0, "%s", file_path);
// Allocate the buffer and print into it
char *tmpBuf = malloc(n+1);
snprintf(tmpBuf, n+1, "%s", file_path);
// Prepare the file to return
FILE *res = fopen(tmpBuf, "r");
// Free the temporary buffer
free(tmpBuf);
return res;