sprintf函數用法舉例
1 #include<stdio.h> 2 int main() 3 { 4 //1.連接字符串 5 char a1[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'}; 6 char a2[] = {'H', 'I', 'J', 'K', 'L', 'M', 'N'}; 7 char buffer[200]; 8 sprintf(buffer, "%.*s%.*s\n", sizeof(a1), a1, sizeof(a2), a2); printf("%s\n", buffer); 9 10 //2.data and place them in the string named buffer.(使用sprintf將各種數據格式化後置於字符數組buffer中) 11 char str[] = "computer", c = 'L'; 12 int i = 35, j; 13 float fp = 1.7320534f; 14 //格式化並打印各種數據到buffer 15 j = sprintf(buffer, "String:%s", str); 16 j += sprintf(buffer + j, "Character:%c", c); 17 j += sprintf(buffer + j, "Integer:%d", i); 18 j += sprintf(buffer + j, "Real:%f", fp); //sprintf返回被寫入buffer的字節數j 19 //Note:sprintf is deprecated; consider using sprintf_s instead 20 printf("Output:\n%s\ncharacter count = %d\n\n", buffer, j); //結束字符‘\0’不計入內 21 22 //3.格式化數字字符串(大多數場合可以替代itoa函數) 23 short m = -1; int n = 100; 24 sprintf(buffer, "%-4d%4d", 123, 4567); printf("%s\n", buffer);//產生"123 4567"其中123左對齊 25 sprintf(buffer, "%08x", 4567); printf("%s\n", buffer); //產生:"000011D7",小寫16進制,寬度占8個位置,左邊補0 的等寬格式 26 sprintf(buffer, "%#04X", (unsigned short)m); printf("%s\n", buffer);//sprintf是個變參函數,除了前面兩個參數之外,後面的參數要保證類型安全 27 sprintf(buffer, "%.2f", (double)n); printf("%s\n", buffer); //同上 28 return 0; 29 } View Code分析:
1.(1)類比打印浮點數的"%m.nf",m 表示占用寬度(字符串長度不足時補空格,超出了則按照實際寬度打印),n表示從相應的字符串中最多取用的字符數,當然也可以前後都只取部分字符。
(2)如果希望這些格式控制符中指定長度的信息數字是動態的,而不是靜態指定的(許多時候程序要到運行時才清楚到底需要取字符數組中的幾個字符),而sprintf采用"*"來占用一個本來需要一個指定寬度或精度的常數數字的位置,而實際的寬度或精度可以和其它被打印的變量一樣被提供出來。
3.如果m不進行強制轉換,那麼函數沒有辦法僅僅通過一個"%X"得知當初函數調用前參數壓棧時被壓進來的到底是個4 字節的整型數還是個2 字節的短整型數,則采取統一4字節的處理方式,導致參數壓棧時符號擴展成32位的整數-1,由於打印時4個位置不夠,會把32位整數-1的8位16進制都打印出來。
本文參考鏈接:
http://baike.baidu.com/link?url=5mhOwQqslSj9dDaAIv2YqSIX4I7WGkNT1ix61dVCPkpwZhFr8P4YHt7AlPeZn6NR85Atrikq-nnwluvW4xR-Nq