可以组合两个字符串,每个字符串的长度为 PATH_MAX?
Possible to combine two strings, each with length of PATH_MAX?
我想构建一个包含文件名(包括完整路径)的字符串。我的做法如下:
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char *argv[] ) {
char
fullpath[PATH_MAX],
workdir[PATH_MAX];
sprintf( workdir, "workdir/" );
sprintf( fullpath, "%sfilename.dat", workdir);
printf( "fullpath = %s\n", fullpath );
return EXIT_SUCCESS;
}
编译时,我收到以下警告
warning: ‘filename.dat’ directive writing 12 bytes into a region of size between 1 and 4096 [-Wformat-overflow=]
sprintf( fullpath, "%sfilename.dat", workdir);
^~~~~~~~~~~~
note: ‘sprintf’ output between 13 and 4108 bytes into a destination of size 4096
sprintf( fullpath, "%sfilename.dat", workdir);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我是否正确理解了该警告(和注释),我可能会组合两个字符串,每个字符串都带有 PATH_MAX
,这会导致问题?
这是否意味着我不应该将带有 PATH_MAX 的字符串与任何其他字符串组合? (至少不是我做的那种简化方式)
sprintf( fullpath, "%sfilename.dat", workdir);
发出警告,因为 workdir
可能过长,以至于连接后的大小超过了 fullpath
的大小
一种没有问题的字符串连接方法:使用 snprintf()
并测试其结果。
int len = snprintf(fullpath, sizeof fullpath, "%sfilename.dat", workdir);
if (len < 0 || (unsigned) len >= sizeof fullpath) {
Handle_Error();
}
我想构建一个包含文件名(包括完整路径)的字符串。我的做法如下:
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char *argv[] ) {
char
fullpath[PATH_MAX],
workdir[PATH_MAX];
sprintf( workdir, "workdir/" );
sprintf( fullpath, "%sfilename.dat", workdir);
printf( "fullpath = %s\n", fullpath );
return EXIT_SUCCESS;
}
编译时,我收到以下警告
warning: ‘filename.dat’ directive writing 12 bytes into a region of size between 1 and 4096 [-Wformat-overflow=]
sprintf( fullpath, "%sfilename.dat", workdir);
^~~~~~~~~~~~
note: ‘sprintf’ output between 13 and 4108 bytes into a destination of size 4096
sprintf( fullpath, "%sfilename.dat", workdir);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我是否正确理解了该警告(和注释),我可能会组合两个字符串,每个字符串都带有 PATH_MAX
,这会导致问题?
这是否意味着我不应该将带有 PATH_MAX 的字符串与任何其他字符串组合? (至少不是我做的那种简化方式)
sprintf( fullpath, "%sfilename.dat", workdir);
发出警告,因为 workdir
可能过长,以至于连接后的大小超过了 fullpath
一种没有问题的字符串连接方法:使用 snprintf()
并测试其结果。
int len = snprintf(fullpath, sizeof fullpath, "%sfilename.dat", workdir);
if (len < 0 || (unsigned) len >= sizeof fullpath) {
Handle_Error();
}