一、完整格式
% - 0 m.n l或h 格式字符
①%:表示格式說明的起始符號,不可缺少。
②-:有-表示左對齊輸出,如省略表示右對齊輸出。
③0:有0表示指定空位填0,如省略表示指定空位不填。
④m.n:m指域寬,若數據的位數小於m,則左端補空格,若大於m,則按實際位數輸出。
n指精度,用於說明輸出的實型數的小數位數。未指定n時,隱含的精度為n=6位。
⑤l或h:l對整型指long型,對實型指double型。h用於將整型的格式字符修正為short型。
二、格式字符
① d格式:用來輸出十進制整數。有以下幾種用法:
%d:按整型數據十進制的實際長度輸出。
%md:m為指定的輸出字段的寬度。如果數據的位數小於m,
則左端補以空格,若大於m,則按實際位數輸出。
%ld:輸出長整型數據。
② o格式:以無符號八進制形式輸出整數。
%o:按整型數據八進制的實際長度輸出。
%lo:對長整型可以用格式輸出
%mo:指定字段寬度為m用格式輸出
③ x格式:以無符號十六進制形式輸出整數。
%x:按整型數據十六進制的實際長度輸出。
%lx:對長整型可以用格式輸出
%mx:指定字段寬度用格式輸出
④ u格式:以無符號十進制形式輸出整數。
%u:按無符號整型數據十進制的實際長度輸出。
%lu:對長整型可以用格式輸出
%mu:指定字段寬度用格式輸出
⑤ c格式:輸出一個字符。
⑥ s格式:用來輸出一個串。有幾中用法
%s:例如:printf("%s", "CHINA")輸出"CHINA"字符串(不包括雙引號)。
%ms:輸出的字符串占m列,如字符串長度大於m,將字符串全部輸出。
若串長小於m,則左補空格。
%-ms:如果串長小於m,則在m列范圍內,字符串向左靠,右補空格。
%m.ns:輸出占m列,但只取字符串中左端n個字符。
這n個字符輸出在m列的右側,左補空格。
%-m.ns:其中m、n含義同上,n個字符輸出在m列范圍的左側,右補空格。
如果n>m,則自動取n值,即保證n個字符正常輸出。
⑦ f格式:用來輸出實數(包括單、雙精度),以小數形式輸出。有以下幾種用法:
%f:不指定寬度,整數部分全部輸出並輸出6位小數。
%m.nf:輸出共占m列,其中有n位小數,如數值寬度小於m左端補空格。
%-m.nf:輸出共占n列,其中有n位小數,如數值寬度小於m右端補空格。
⑧ e格式:以指數形式輸出實數。可用以下形式:
%e:數字部分(又稱尾數)輸出6位小數,指數部分占5位或4位。
%m.ne和%-m.ne:m、n和”-”字符含義與前相同。
此處n指數據的數字部分的小數位數,m表示整個輸出數據所占的寬度。
⑨ p格式:輸出指針地址
三、實例
如果想輸出字符"%",則應該在“格式控制”字符串中用連續兩個%表示,如:
printf("%f%%", 1.0/3);
輸出0.333333%。
對於m.n的格式還可以用如下方法表示
char ch[20];
printf("%*.*s\n",m,n,ch);
前邊的*定義的是總的寬度,后邊的定義的是輸出的個數。分別對應外面的參數m和n 。
這種方法的好處是可以在語句之外對參數m和n賦值,從而控制輸出格式。
如何用printf 實現可變的域寬度? 就是說,我想在運行時確定寬度而不是使用 %8d
使用 printf("%*d", width, x)
格式說明符中星號表示,參數列表中的一個int值用來表示域的寬度。
########### printf 是 右(先)入棧 ########### #include <stdio.h> #include <stdlib.h> #include <stdint.h> int main() { uint64_t a = 0x0000000100000002; int rc = -5; printf("%llu leon %d\n", a, rc); //out: 4294967298 leon -5 printf("%d leon %d\n", a, rc); //out: 2 leon 1 printf("%d again %d %d\n", a,rc); //out: 2 again 1 -5 uint32_t b ; memcpy(&b, &a, sizeof(uint32_t)); printf("%d kjfsfljs\n", b); //out: 2 kjfsfljs (說明是小端) return 0; }
printf函數詳細講解
(1)簡介:
printf函數是c語言當中非常重要的格式化輸出函數
其函數原型為:int printf(const char *format, ...);
其函數返回值:打印出的字符格式
其調用格式為:printf("<格式化字符串>", <參量表>);
(2)轉換說明:
轉換格式為:%[標志][寬度][.精度][類型長度]類型
除了最后的類型之外都是可選的字段
標志 | 意義 |
- | 項目是左對齊的;也就是說,會把項目打印在字段的左側開始處。示例:"%-20s" |
+ | 有符號的值若為正,則顯示帶加號的符號;若為負,則帶減號的符號。示例:"%+6.2f" |
(空格) | 帶符號的值若為正,則顯示時帶前導空格(但是不顯示符號);若為負,則帶減號符號。+標志會覆蓋空格標志;示例:"% 6.2f" |
# | 使用轉換說明的可選形式。若為%o格式,則以0開始;若為%x或%X格式,則以0x或0X開始。對於所有的浮點形式,#保證了即使不跟任何數字,也打印一個小數點符號。對於%g和%G格式,它防止尾隨0被刪除;示例:"%#o" |
0 | 對於所有的數字格式,用前導0而不是用空格填充字段。如果出現-標志或者指定了精度(對於整數)則忽略該標志;示例:"%010d" |
修飾符 | 意義 |
digit(s) | 字段寬度的最小。如果該字段不能容納要打印的數或者字符串,系統就會使用更寬的字段。示例:"%4d" |
.digit(s) | 精度,對於%e,%E和%f轉換,是將要在小數點的右邊打印的數字的位數。對於%g和%G轉換,是有效數字的最大位數。對於%s轉換,是將要打印的字符的最大數目。對於整數轉換,是將要打印的數字的最小位數;如果必要,要使用前導0來達到這個位數。只使用"."表示其后跟隨一個零,所以%.f和%.0f相同;示例:"%5.2f"打印一個浮點數,他的字段寬度為5個字符,小數點后面有兩位數字 |
修飾符 | 意義 |
h | 和整數轉換說明符一起使用,表示一個short int或unsigned short int類型數值;示例:"%hu" "%hd" "%hx" |
hh | 和整數轉換說明符一起使用,表示一個signed char或unsigned char類型數值;示例:"%hhu" "%hhd" "%hhx" |
j | 和整數轉換說明符一起使用,表示一個intmax_t或uintmax_t值;示例:"%jd" "%jX" |
l | 和整數轉換說明符一起使用,表示一個long int或unsigned long int類型數值;示例:"%lu" "%ld" |
ll | 和整數轉換說明符一起使用,表示一個long long int或unsigned long long int類型數值(c99);示例:"%llu" "%lld" |
L | 和浮點轉換說明符一起使用,表示一個long double值;示例:"%Lf" "%Le" |
t | 和整數轉換說明符一起使用,表示一個ptrdiff_t值(與兩個指針之間的差對應的類型)(c99);示例:"%td" |
z | 和整數轉換說明符一起使用,表示一個size_t值(sizeof返回類型)(c99);示例:"%zd" |
I64 | 和整數轉換說明符一起使用,表示一個_int64值 |
轉換說明 | 輸出 |
%a | 浮點數、十六進制數字和p-計數法(c99) |
%A | 浮點數、十六進制數字和P-計數法(c99) |
%c | 一個字符 |
%d | 有符號十進制整數 |
%e | 浮點數、e-記數法 |
%E | 浮點數、E-計數法 |
%f | 浮點數、十進制記數法 |
%g | 根據數值不同自動選擇%f或%e。%e格式在指數小於-4或者大於精度時使用 |
%G | 根據數值不同自動選擇%f或%E。%E格式在指數小於-4或者大於精度時使用 |
%i | 有符號十進制整數(與%d相同) |
%o | 有符號八進制整數 |
%p | 指針 |
%s | 字符串 |
%u | 無符號十進制整數 |
%x | 使用十六進制數0x的無符號十六進制整數 |
%X | 使用十六進制數字0X的無符號十六進制證書 |
%% | 打印一個百分號 |
(3)示例:
(4)浮點參數的轉換:
有用於打印浮點類型double和long double的轉換說明符,但沒有用於float的說明符。原因是在K&R C中float值在被用於表達式中或者被用作參數之前,會被自動轉換成double類型。一般情況下,ANSI C不會自動把float轉換成double。不過,為了保護大量現有的假設float參數仍會自動被轉換成double。因此,不過是K&R C還是ANSI C,都無需專門的轉換說明符來顯示float。
c++輸出精度控制
題目描述:
數列的第一項為n,以后各項為前一項的平方根,求數列的前m項的和。
輸入描述:
輸入數據有多組,每組占一行,由兩個整數n(n < 10000)和m(m < 1000)組成,n和m的含義如前所述。
輸出描述:
對於每組輸入數據,輸出該數列的和,每個測試實例占一行,要求精度保留2位小數。
這里涉及到一個輸出精度的控制,我們知道在這C語言中,控制輸出精度可以直接用以下代碼。
printf("%.2lf\n",sum);
在C++中輸出控制精度需要用到std::ios_base::precison,即std::cout.precison()。這個函數是用來控制輸出的有效位,如下所示
double n = 0.001010; cout.precision(4); cout << n << endl;
這個的輸出結果就是0.00101。從第一個1開始為第一個有效位,連續輸出4個有效位,最后一位的0被省略。這並沒有達到我們要設置小數點后位數的要求,所以在查閱了資料后發現結合std::fixed使用可以控制小數點后的位數,使用方法如下:
double n = 0.001010; cout.precision(4); cout << fixed << n << endl;
這個的輸出結果就是0.0010。
需要注意的是 cout.precision(4); 后cout的精度一直都是4個有效位,若設置了fixed,就一直控制小數點后的位數。目前還沒有消除precision的方法,只能重新設置成新的有效位,但是針對fixed可是通過cout.unsetf( ios::fixed );來消除。
若定義float a;現要從鍵盤輸入a數據,其整數位為3位,小數位為2位,則選用( A) A)scanf(“%6f”,&a); B)scanf(“%5.2f”,a); C)scanf(“%6.2f”,&a); D)scanf(“%f”,a); 為什么不是scanf("%3.2f",&a); 例子 #include<stdio.h> #include<stdlib.h>int main(){int k;float f;scanf("%3d%*4d%6f",&k,&f);printf("%d%f",k,f); return 0;} 原來scanf不能對精度進行控制,在scanf中的%6f表示讀取一個長度為6位(含小數點)的浮點型數據。 (3) scanf()函數中沒有精度控制。 如: scanf("%5.2f",&a); 是非法的。不能企圖用此語句輸入小數為2位的實數。 所以可以得出結論:scanf和printf對數據長度的控制不同,scanf不能控制精度只能控制長度,printf可以控制長度也可以控制精度。 然后又發現了一樣東西: %*d4表示忽略一個4位的整數 於是又寫了兩個demo測試了一下 1.忽略前五位 #include<stdio.h>#include<stdlib.h> int main(){ int k; scanf("%*5d%d",&k);printf("%d",k); return 0; } 輸入了123456后,輸出結果為6 2.忽略后五位 #include<stdio.h>#include<stdlib.h> int main(){ int k; scanf("%1d%*5d",&k);printf("%d",k); return 0; } 輸入了123456后,輸出結果為1 當scanf正確讀入時,返回值是和讀取的變量數目相等的,也就是讀取了幾個數就返回多少,而當讀取出錯、讀到文件末尾時,scanf函數會返回-1
有效數字 從一個數的左邊第一個非0數字起,到末位數字止,所有的數字都是這個數的有效數字。 就是一個數從左邊第一個不為0的數字數起到末尾數字為止,所有的數字(包括0,科學計數法不計10的N次方),稱為有效數字。
簡單的說,把一個數字前面的0都去掉,從第一個正整數到精確的數位止所有的都是有效數字了。 如:0.0109,前面兩個0不是有效數字,后面的109均為有效數字(注意,中間的0也算)。 3.109*10^5(3.109乘以10的5次方)中,3 1 0 9均為有效數字,后面的10的5次方不是有效數字。 5.2*10^6,只有5和2是有效數字。 0.0230,前面的兩個0不是有效數字,后面的230均為有效數字(后面的0也算)。 1.20 有3個有效數字。 1100.120 有7位有效數字。 2.998*10^4(2.998乘以10的4次方)中,保留3個有效數字為3.00*10^4。 對數的有效數字為小數點后的全部數字,如log x=1.23有效數字為2.3,log a=2.045有效數字為0、4.5,pH=2.35有效數字為3.5。 整體遵循“四舍五入”的方法