print輸出控制


一、完整格式

%   - 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)示例:

 1     #include <stdio.h>
 2 
 3     int main() {
 4     const char * pString = "Hello World";
 5     const int    nNumber = 1024;
 6     const double dNumber = 3.141593;
 7     //  %d  示例
 8     printf("*%d*\n", nNumber);          //輸出:*1024*
 9     printf("*%6d*\n", nNumber);         //輸出:*  1024*
10     printf("*%6.5d*\n", nNumber);       //輸出:* 01024*
11     printf("*%-6.5d*\n", nNumber);      //輸出:*01024 *
12     printf("*%06d*\n", nNumber);        //輸出:*001024*
13     printf("*%+6d*\n", nNumber);        //輸出:* +1024*
14 
15     //  %f  示例
16     printf("*%f*\n", dNumber);          //輸出:*3.141593*
17     printf("*%10f*\n", dNumber);        //輸出:*  3.141593*
18     printf("*%10.2f*\n", dNumber);      //輸出:*      3.14*
19     printf("*%-10.2f*\n", dNumber);     //輸出:*3.14      *
20     printf("*%+10.2f*\n", dNumber);     //輸出:*     +3.14*
21     printf("*%010.2f*\n", dNumber);     //輸出:*0000003.14*
22 
23     //  %s  示例
24     printf("*%s*\n", pString);          //輸出:*Hello World*
25     printf("*%20s*\n", pString);        //輸出:*         Hello World*
26     printf("*%-20s*\n", pString);       //輸出:*Hello World         *
27     printf("*%.10s*\n", pString);       //輸出:*Hello Worl*
28     return 0;
29 }

 

 

(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^53.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^42.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
。 整體遵循“四舍五入”的方法

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM