3

谁能告诉我这是什么意思:"%.*s"

例如,它在这里使用:

  sprintf(outv->deliveryAddressCity, 
          "%.*s",
          sizeof(outv->deliveryAddressCity)-1,
          mi->deliveryAddressCity);
4

7 回答 7

8

%.*s表示从以下缓冲区打印前 X 个字符。在这种情况下,从 打印第一个sizeof(outv->deliveryAddressCity) - 1字符mi->deliveryAddressCity,防止超出 的范围outv->deliveryAddressCity

一个更短的例子:

printf("%.*s", 4, "hello world");

会打印hell.

于 2013-03-04T16:02:36.490 回答
2

也许你可以通过这个例子得到它:

printf("%.*s", 3, "abcdef");

打印“abc”。

于 2013-03-04T16:03:34.517 回答
2

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

所以在你的情况下,字符串的大小是sizeof(outv->deliveryAddressCity )-1

于 2013-03-04T16:04:02.933 回答
1

宽度和精度格式参数可以省略,或者它们可以是嵌入格式字符串中的固定数字,或者在格式字符串中由星号“*”指示时作为另一个函数参数传递。例如 printf("%*d", 5, 10) 将导致打印 "10",总宽度为 5 个字符,而 printf("%.*s", 3, "abcdef") 将导致“abc”正在打印。

(在搜索引擎上很容易找到它......)

于 2013-03-04T16:05:15.243 回答
1

当您有一个非空终止的字符串并且长度存储在其他地方时,它最常使用。

例如:

{
    char* regular_string = "Hello World";  // This string has a null-Terminator.

    char untermed_string[11];
    int len;

    // Specifically make untermed string so it is NOT null-terminated.
    memcpy(untermed_string, regular_string, 11);
    len = 11;

    printf("The string is %.*s\n", len, untermed_string); // This will still print the proper data!
    printf("The start of the string is %.*s\n", 5, untermed_string); // This will only print "Hello".
}
于 2013-03-04T16:06:49.993 回答
0

这是一个格式说明符,它从堆栈中获取 2 个值,第一个是大小,第二个是值。

.-notation:atleast-length.maxlength(所以“.*”表示:最大 * 个字符)

于 2013-03-04T16:03:10.197 回答
0

它可以帮助您打印字符串的一部分。您可以指定打印字符串的长度。示例:printf("%.*s", 5,,"rahul subedi") 输出:rahul

于 2013-03-04T16:15:15.967 回答