。*未指定精度 格式字符串,但作为 附加整数值参数 必须在参数之前 格式化。
#define SUFF ".txt"
#define MAX_STR 50
fileName[MAX_STR];
name ="myFile"
sprintf( fileName, "%s%s", name, SUFF ); //fileName = "myFile.txt"
现在我想要精确地绑定字符串。
我想要做的基本事情(但是使用更多动态计算,这就是我使用'*'的原因)是:
sprintf( fileName, "%.*s%.*s", 46, 4, name, SUFF );
但是,即使这样也会产生运行时异常。
更具体地说:
sprintf( fileName, "%.*s%.*s",
MAX_STR - (int) sizeof(SUFF), (int) sizeof(SUFF),
name, SUFF );
答案 0 :(得分:3)
您对变量参数的顺序错误。 width参数与object参数一起使用(它必须紧跟在对象之前)。
sprintf(fileName,
"%.*s%.*s",
MAX_STR - (int) sizeof(SUFF), // precision and...
name, // ...object
(int) sizeof(SUFF), // precision and...
SUFF // ...object
);
即使您要使用宽度说明符,使用snprintf
代替sprintf
仍然要好得多。
答案 1 :(得分:2)
您混淆了最终sprintf
中参数的顺序。它应该是这样的:
sprintf( fileName, "%.*s%.*s",
MAX_STR - (int) sizeof(SUFF), name,
(int) sizeof(SUFF), SUFF );
还有一些值得注意的事情:
sprintf
是错误的工具,并且由于大小也是固定的,因此不需要传递这样的精度。像char fileName[] = "myFile" SUFF;
这样的东西绰绰有余。sprintf
的参数,并在编译时告诉你有关你的错误。看看format
attribute。答案 2 :(得分:1)
更简单的选择是asprintf() - 如果足够可移植(在我使用C而不是C ++时曾经是一个问题) - 希望它现在是标准化和通用的。它没有像mallocs内存那么快,你需要事后明确释放,但它让程序员在格式化方面考虑输入是什么,而不必跳过箍或在其大小上添加任意约束,这避免了许多小错误和限制。