C語言格式化輸出輸入


1.簡單的輸入輸出的例子

#include <stdio.h>
int main(void) {
    char your_print[40];
    scanf("%s", your_print);
    printf("this is your print:%s", your_print);

    return 0;
}

一個%s表示對位后面的一個字符串,當然輸入輸出也可以不加入占位符。

2.printf函數的轉換說明

轉換說明 輸出
%a 浮點數,十六進制數和p記數法(C99/C11)
%A 同上
%c 單個字符
%d 有符號十進制整數
%e 浮點數,e記數法
%E 同上
%f 浮點數,十進制記數法
%g 自動選擇%f或%e,%e用於指數小於-4
%G 自動選擇%f或%E,
%i 有符號十進制整數(同%d)
%o 無符號八進制整數
%p 指針
%s 字符串
%u 無符號十進制整數
%x 無符號十六進制整數,使用十六進制數0f
%X 同上,使用0F
%% 百分號
%zd sizeof()

一個簡單的例子:

#include <stdio.h>
#define PI 3.141593

int main(void) {
    int number = 7;
    float pies = 12.75;
    int cost = 7800;

    printf("The %d contestants ate %f berry pies.\n", number, pies);
    printf("The value of pi is %f.\n", PI);
    printf("Farewell! thou art too dear for my possessing,\n");
    printf("%c%d\n", '$', 2*cost);

    return 0;
}

輸出:

The 7 contestants ate 12.750000 berry pies.
The value of pi is 3.141593.
Farewell! thou art too dear for my possessing,
$15600

3.printf的轉換說明修飾符

在%和轉換字符之間插入修飾符可修飾基本的轉換說明。注意編譯器要支持C99.

修飾符

數字 最小字符寬度  %4d
.數字 精度,小數點右邊的數字表示如下
對於%e%E%f,表示小數點右邊數字的位數
對於%g%G,表示有效數字最大位數
對於%s,表示待打印字符的最大數量
對於整型,表示最小位數,不夠的前面加0
只用.表示其后跟隨一個0,所以%.f和%.0f相同
比如:%5.2f
h 和整型轉換說明一起使用,表示short int或者unsigned short int類型的值
hh 表示signed char或者unsigned char類型的值
j 表示intmax_t或者uintmax_t類型的值,這些類型在stdint.h中
l 表示long int或者unsigned long int類型的值
ll long long int或者unsigned long long int(C99)
L long double
t 表示ptrdiff_t類型的值。(C99)
z 表示size_t類型的值。(C99)

標記修飾符

- 待打印左對齊,從字段的左側開始打印該項
+ 顯示符號,為正顯示+,為負顯示-,沒有則不顯示。比如%+6.2f
空格 同顯示符號,為正不顯示符號顯示空格,負號顯示-。比如% 6.2f
# 將結果轉換成另外一種形式,如果是%o格式,則以0開始,%x或者%X,則以0x或者0X。浮點格式則是強行打印一個小數點,,對於%g或%G格式,防止結果后面的0被刪除
比如:%#o, %#8.0f, %+#10.3e
0 對於數值格式,用前導0代替空格填充字符寬度。對於整數格式,如果出現-標記或者指定精度,則忽略該標記。
比如:%010d和%0.83f

打印整數的例子:

#include <stdio.h>
#define PAGE 959

int main(void) {
    printf("*%d*\n", PAGE);
    printf("*%2d*\n", PAGE);
    printf("*%10d*\n", PAGE);
    printf("*%-10d*\n", PAGE);

    return 0;
}

輸出如下,第二個字段寬度會自動擴大,第三個例子兩個星號之間有7個空格和三個數字。

*959*
*959*
*       959*
*959       *
打印浮點數的例子:
#include <stdio.h>

int main(void) {
    const double RENT = 3852.99;

    printf("*%f*\n", RENT);
    printf("*%e*\n", RENT);
    printf("*%4.2f*\n", RENT);
    printf("*%3.1f*\n", RENT);
    printf("*%10.3f*\n", RENT);
    printf("*%10.3E*\n", RENT);
    printf("*%+4.2f*\n", RENT);
    printf("*%010.2f*\n", RENT);

    return 0;
}

輸出,注意010.2f第一個0是標記0.

*3852.990000*
*3.852990e+03*
*3852.99*
*3853.0*
*  3852.990*
* 3.853E+03*
*+3852.99*
*0003852.99*
一些格式標記:
#include <stdio.h>

int main(void) {

    printf("%x %X %#X\n", 31, 31, 31);
    printf("%**d**% d**% d**\n", 42, 42, -42);
    printf("**%5d**%5.3d**%05d**%05.3d**\n", 6, 6, 6, 6);

    return 0;
}
輸出結果,在有精度的情況下,多余的0會被忽略。
1f 1F 0X1F
**42** 42**-42**
**    6**  006**00006**  006**

字符串格式的例子:

#include <stdio.h>
#define BLURB "Authentic imitation!"

int main(void) {

    printf("[%2s]\n", BLURB);
    printf("[%24s]\n", BLURB);
    printf("[%24.5s]\n", BLURB);
    printf("[%-24.5s]\n", BLURB);

    return 0;
}

結果如下,對於.5則是只打印5個字符

[Authentic imitation!]
[    Authentic imitation!]
[                   Authe]
[Authe                   ]

4.printf的返回值

大部分的C函數都有一個返回值,printf函數返回打印字符的個數。如果輸出錯誤,printf則返回一個負值。

5.跨行打印

使用反斜杠,注意第二行代碼不要縮進,如果縮進每個空格都會成為字符串的一部分。

printf("here is a way to print a \ 
long string.\n")

6.scanf函數的基本使用

對於scanf函數和printf函數類似,不過scanf函數會使用指針。如果scanf函數讀取基本變量的值,則使用指針,如果把字符串讀入字符數組,不要使用&。

int main(void) {
    int age;
    float assets;
    char pet[30];

    printf("Enter your age, assets, and favorite pet.\n");
    scanf("%d %f", &age, &assets);
    scanf("%s", pet);
    printf("%d $%.2f %s\n", age, assets, pet);

    return 0;
}

輸出結果:

Enter your age, assets, and favorite pet.
38
92360.88 llama
38 $92360.88 llama

7.scanf的轉換說明

scanf的轉換說明與printf的轉換說明幾乎相同,主要區別在於多了%c這個把整個輸入變成字符,和float類型和double類型中,printf會區分%f%e%F%g%G,而scanf()只把他用於float類型,double類型要使用l修飾符。

轉換說明比較復雜在這里就不列出了。

scanf函數的轉換說明與輸入字符會嚴格匹配。

比如

scanf("%d,%d", &n, &m);

用戶必須在n的后面輸入一個逗號,否則scanf會跳過所有空白。

類似下面的輸入是合法的:

88, 121

88,       121

88  ,  121

8.scanf的返回值

scanf函數返回成功讀取的項數,如果沒有,則返回0.當檢測到”文件結尾”,會返回EOF。

9.printf和scanf函數的修飾符*

printf和scanf都可以用*修飾符來修改轉換說明,但是用法不一樣。下面是printf使用變寬輸出的例子

#include <stdio.h>

int main(void) {
    unsigned width, precision;
    int number=256;
    double weight=242.5;

    printf("Enter a field width:\n");
    scanf("%d", &width);
    printf("The number is:%*d:\n", width, number);
    printf("Now enter a width and a precision:\n");
    scanf("%d %d", &width, &precision);
    printf("weight=%*.*f\n", width, precision, weight);

    return 0;
}

輸出結果如下:

Enter a field width:
6
The number is:   256:
Now enter a width and a precision:
8 3
weight= 242.500

但是scanf用法不同,如果放在%和字符之間,就會跳過相應輸出。

10.總結

轉換說明的意義:轉換說明把以二進制格式儲存在計算機中的值轉換成一系列字符來顯示。實際上,轉換是一種翻譯說明。比如把01001100, %d轉換將其翻譯為字符7和6.

轉換說明應該與待打印值的類型相匹配,否則就會出現問題。


免責聲明!

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



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