C語言歸納二-數據的輸入輸出

一、彙總前面學過的格式控制符

格式控制符 說明
%c 輸出一個單一的字符
%hd、%d、%ld 以十進制、有符號的形式輸出 short、int、long 類型的整數
%hu、%u、%lu 以十進制、無符號的形式輸出 short、int、long 類型的整數
%ho、%o、%lo 以八進制、不帶前綴、無符號的形式輸出 short、int、long 類型的整數
%#ho、%#o、%#lo 以八進制、帶前綴、無符號的形式輸出 short、int、long 類型的整數
%hx、%x、%lx
%hX、%X、%lX
以十六進制、不帶前綴、無符號的形式輸出 short、int、long 類型的整數。如果 x 小寫,那麼輸出的十六進制數字也小寫;如果 X 大寫,那麼輸出的十六進制數字也大寫。
%#hx、%#x、%#lx
%#hX、%#X、%#lX
以十六進制、帶前綴、無符號的形式輸出 short、int、long 類型的整數。如果 x 小寫,那麼輸出的十六進制數字和前綴都小寫;如果 X 大寫,那麼輸出的十六進制數字和前綴都大寫。
%f、%lf 以十進制的形式輸出 float、double 類型的小數
%e、%le
%E、%lE
以指數的形式輸出 float、double 類型的小數。如果 e 小寫,那麼輸出結果中的 e 也小寫;如果 E 大寫,那麼輸出結果中的 E 也大寫。
%g、%lg
%G、%lG
以十進制和指數中較短的形式輸出 float、double 類型的小數,並且小數部分的最後不會添加多餘的 0。如果 g 小寫,那麼當以指數形式輸出時 e 也小寫;如果 G 大寫,那麼當以指數形式輸出時 E 也大寫。
%s 輸出一個字符串

二、printf用法

2.1 長度控制

(1)width表示最小輸出寬度,'-'表示左對齊,不加是右對齊。

#include <stdio.h>
int main()
{
    int a1=20, a2=345, a3=700, a4=22;
    int b1=56720, b2=9999, b3=20098, b4=2;
    int c1=233, c2=205, c3=1, c4=6666;
    int d1=34, d2=0, d3=23, d4=23006783;

    printf("%-9d %-9d %-9d %-9d\n", a1, a2, a3, a4);
    printf("%-9d %-9d %-9d %-9d\n", b1, b2, b3, b4);
    printf("%-9d %-9d %-9d %-9d\n", c1, c2, c3, c4);
    printf("%-9d %-9d %-9d %-9d\n", d1, d2, d3, d4);

    return 0;
}

m 是正數,以%+d輸出時要帶上正號;n 是負數,以+d輸出時要帶上負號。

m 是正數,以% d輸出時要在前面加空格;n 是負數,以% d輸出時要在前面加負號。

%.0f表示保留 0 位小數,也就是隻輸出整數部分,不輸出小數部分。默認情況下,這種輸出形式是不帶小數點的,但是如果有了#標誌,那麼就要在整數的後面“硬加上”一個小數點,以和純整數區分開。

#include <stdio.h>
int main(){
    int m = 192, n = -943;
    float f = 84.342;
    printf("m=%10d, m=%-10d\n", m, m);  //演示 - 的用法
    printf("m=%+d, n=%+d\n", m, n);  //演示 + 的用法
    printf("m=% d, n=% d\n", m, n);  //演示空格的用法
    printf("f=%.0f, f=%#.0f\n", f, f);  //演示#的用法

    return 0;
}

輸出結果:

m=       192, m=192      
m=+192, n=-943
m= 192, n=-943
f=84, f=84.

(2)精度長度控制

.precision 表示輸出精度,也就是小數的位數。

  • 當小數部分的位數大於 precision 時,會按照四捨五入的原則丟掉多餘的數字;
  • 當小數部分的位數小於 precision 時,會在後面補 0。

另外,.precision 也可以用於整數和字符串,但是功能卻是相反的:

  • 用於整數時,.precision 表示最小輸出寬度。與 width 不同的是,整數的寬度不足時會在左邊補 0,而不是補空格。
  • 用於字符串時,.precision 表示最大輸出寬度,或者說截取字符串。當字符串的長度大於 precision 時,會截掉多餘的字符;當字符串的長度小於 precision 時,.precision 就不再起作用。
#include <stdio.h>
int main(){
    int n = 123456;
    double f = 882.923672;
    char *str = "abcdefghi";
    printf("n: %.9d  %.4d\n", n, n);
    printf("f: %.2lf  %.4lf  %.10lf\n", f, f, f);
    printf("str: %.5s  %.15s\n", str, str);
    return 0;
}

/*
運行結果:
n: 000123456  123456
f: 882.92  882.9237  882.9236720000
str: abcde  abcdefghi
*/

關於printf()的輸出,要注意一下緩衝區問題。

Linux和Mac OS下數據不直接輸出,沒有\n就先放到緩衝區,不顯示,遇到\n顯示,Windows下不是。

2.2 在屏幕的任何位置輸出數據

光標定位需要使用 windows.h 頭文件中的SetConsoleCursorPosition函數,它的使用方式爲:

SetConsoleCursorPosition(HANDLE hConsoleOutput, COORD  dwCursorPosition);

hConsoleOutput表示控制檯緩衝區句柄,可通過GetStdHandle(STD_OUTPUT_HANDLE)來獲得;dwCursorPosition是光標位置,也就是第幾行第幾列,它是 COORD 類型的結構體。

例如,將光標定位到控制檯的第3行第3列:

#include <stdio.h>
#include <windows.h>

int main(){
    //定義光標位置
    COORD coord;
    coord.X = 3;  //第3行
    coord.Y = 3;  //第3列
    //獲取控制檯緩衝區句柄
    HANDLE ConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
    //設置光標位置
    SetConsoleCursorPosition(ConsoleHandle, coord);

    printf("123");

    return 0;
}

注意:窗口的左上角是第 0 行第 0 列,而不是我們通常所認爲的第 1 行第 1 列。編程語言中的很多計數都是從 0 開始的,而不是從 1 開始。

搞定了光標重定位,你就可以將輸出順序打亂了,想在哪裏輸出就在哪裏輸出。例如:

#include <stdio.h>
#include <windows.h>

//設置光標位置
void setCursorPosition(int x, int y);
//設置文字顏色
void setColor(int color);

int main(){
    setColor(3);
    setCursorPosition(3, 3);
    puts("★");

    setColor(0XC);
    setCursorPosition(1, 1);
    puts("◆");

    setColor(6);
    setCursorPosition(6, 6);
    puts("■");

    return 0;
}

//自定義的光標定位函數
void setCursorPosition(int x, int y){
    COORD coord;
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
//自定義的文字顏色函數
void setColor(int color){
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color) ;
}

運行結果:

三、輸入用法

在C語言中,有多個函數可以從鍵盤獲得用戶輸入:

  • scanf():和 printf() 類似,scanf() 可以輸入多種類型的數據。
  • getchar()、getche()、getch():這三個函數都用於輸入單個字符。
  • gets():獲取一行數據,並作爲字符串處理。

scanf() 是最靈活、最複雜、最常用的輸入函數,但它不能完全取代其他函數,大家都要有所瞭解。

3.1 scanf()函數

scanf格式化掃描輸入。注意"%d %d"之間是有空格的,所以輸入數據時也要有空格。scanf() 對輸入數據之間的空格的處理比較寬鬆,並不要求空格數嚴格對應,多幾個少幾個無所謂,只要有空格就行。。對於 scanf(),輸入數據的格式要和控制字符串的格式保持一致。

%p是一個新的格式控制符,它表示以十六進制的形式(帶小寫的前綴)輸出數據的地址。如果寫作%P,那麼十六進制的前綴也將變成大寫形式。

#include <stdio.h>
int main()
{
    int a='F';
    int b=12;
    int c=452;
    printf("&a=%p, &b=%p, &c=%p\n", &a, &b, &c);
   
    return 0;
}

注意一下這個代碼及相對應的輸入:

#include <stdio.h>
int main()
{
    int a, b, c;

    scanf("%d %d", &a, &b);
    printf("a+b=%d\n", a+b);
    scanf("%d   %d", &a, &b);
    printf("a+b=%d\n", a+b);
    scanf("%d, %d, %d", &a, &b, &c);
    printf("a+b+c=%d\n", a+b+c);
   
    //劃重點下面這部分。
    scanf("%d is bigger than %d", &a, &b);
    printf("a-b=%d\n", a-b);

    return 0;
}

運行結果:

10    20↙
a+b=30
100 200↙
a+b=300
56,45,78↙
a+b+c=179
25 is bigger than 11↙
a-b=14

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章