我可以在两个字符串的字符串格式中使用两个精度'*'吗?

时间:2010-09-30 23:05:36

标签: c++ c variables

  

。*未指定精度   格式字符串,但作为   附加整数值参数   必须在参数之前   格式化。

#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 );

3 个答案:

答案 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 );

还有一些值得注意的事情:

    如果您在编译时分配了字符串,则
  1. sprintf是错误的工具,并且由于大小也是固定的,因此不需要传递这样的精度。像char fileName[] = "myFile" SUFF;这样的东西绰绰有余。
  2. 一个好的编译器(我猜测你是按照古老的风格使用MSVC),实际上会解析sprintf的参数,并在编译时告诉你有关你的错误。看看format attribute

答案 2 :(得分:1)

更简单的选择是asprintf() - 如果足够可移植(在我使用C而不是C ++时曾经是一个问题) - 希望它现在是标准化和通用的。它没有像mallocs内存那么快,你需要事后明确释放,但它让程序员在格式化方面考虑输入是什么,而不必跳过箍或在其大小上添加任意约束,这避免了许多小错误和限制。