2013-03-04 96 views
3

谁能告诉我这是什么意思:"%.*s"“%。* s”是什么意思作为printf中的格式说明符?

例如,在这里使用:

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

http://www.cplusplus.com/reference/cstdio/printf/ – djechlin 2013-03-04 16:03:30

+0

我冒昧地编辑由于代码不可读,因此将参数放在sprintf的不同行上。 – Lundin 2013-03-04 16:05:03

+0

和你的重复 - http://stackoverflow.com/questions/5296123/what-does-this-statement-mean-printf-s-int-lengthsi – djechlin 2013-03-04 16:09:08

回答

7

%.*s意味着打印从下面的缓冲字符的第X号。在这种情况下,请打印mi->deliveryAddressCity中的第一个sizeof(outv->deliveryAddressCity) - 1个字符,防止写入超出outv->deliveryAddressCity的范围。

较短例如:

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

将打印hell

0

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

的。记法:ATLEAST-length.maxlength(就意味着 “*”:最大*字符)

2

也许你可以用这个例子中得到它:

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

打印 “ABC” 。

1

的宽度和精度格式化参数可以被省略,或他们可以是嵌入在格式字符串的固定数量,或者作为通过格式字符串中用星号“*”表示的另一个函数参数。例如,printf(“%* d”,5,10)将导致打印出“10”,总宽度为5个字符,printf(“%。* s”,3,“abcdef”)将导致正在打印“abc”。

(这是很容易找到它的搜索引擎......)

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". 
} 
+0

例如当混合C和Fortran,其中空格键而不是空终止(yuck)时, – djechlin 2013-03-04 16:08:11

0

它可以帮助您打印字符串的一部分。你可以指定你必须打印字符串的长度。例如:printf(“%。* s”,5,“rahul subedi”) 输出: rahul

相关问题