程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 不可或缺 Windows Native (4),windowsnative

不可或缺 Windows Native (4),windowsnative

編輯:關於C語言

不可或缺 Windows Native (4),windowsnative


[源碼下載]


不可或缺 Windows Native (4) - C 語言: 預處理命令,輸入,輸出



作者:webabcd


介紹
不可或缺 Windows Native 之 C 語言

  • 預處理命令
  • 輸入
  • 輸出



示例
1、預處理命令
cPreprocessor.h

#ifndef _MYHEAD_PREPROCESSOR_
#define _MYHEAD_PREPROCESSOR_ 

#ifdef __cplusplus  
extern "C"
#endif  

char *demo_cPreprocessor();

#endif  

cPreprocessor.c

/*
 * 預處理命令
 *
 * 以“#”開頭的就是預處理命令(預處理命令不用“;”結尾),其是指在編譯之前所做的工作
 */

#include "pch.h"
#include "cPreprocessor.h"
#include "cHelper.h"



// #define - 宏定義命令,在編譯預處理時,對程序中所有出現的“宏名”,都用宏定義中的字符串去代換,這稱為“宏代換”或“宏展開”
#define PI 1000 //  #define 標識符 字符串
#define S PI * r * r // 一個宏也可以引用另一個宏
#define S2(r) PI * r * r // 宏是可以帶參數的
#define PI 3.14 // 宏重名的話,後面的會替換前面的
#define INTEGER int // 宏定義當然也可以定義數據類型,因為其本質就是拿一個字符串替換另一個字符串
#define ISWINDOWS 1
#define X(n) n == 0 ? 0 \
    : -1 // 一個長的 #define 可以用“\”分成多行


// 說到這裡再插一句,單行注釋的話 \
以“\”結尾則下一行也為注釋 \
另外:ANSI C 只支持“/**/”注釋,而不支持“//”注釋


/*
再強調一遍,宏定義的本質就是拿一個字符串替換另一個字符串

如果是 #define x 1 + 2
那麼表達式 3 * x * 4 就相當於 3 * 1 + 2 * 4,結果是 11
如果是 #define x (1 + 2)
那麼表達式 3 * x * 4 就相當於 3 * (1 + 2) * 4,結果是 36
*/



/*
#include - 文件包含命令

#include "stdio.h" 使用雙引號表示首先在文件當前目錄中查找(支持絕對路徑和相對路徑),若未找到則到包含目錄中去查找
#include <math.h> 使用尖括號表示在包含文件目錄中去查找,而不在文件當前目錄去查找

包含文件目錄的設置:項目 -> 右鍵 -> 屬性 -> 配置屬性 -> VC++ 目錄 -> 包含目錄
*/



char *demo_cPreprocessor()
{
    INTEGER r = 2; // 宏展開其相當於 int r = 2;
    float x = S; // 宏展開其相當於 3.14 * r * r,即 3.14 * 2 * 2

    float y = S2(2); // 宏展開其相當於 3.14 * 2 * 2

    int z = X(100); // -1

    

// 條件編譯命令有:#ifdef, #else, #endif, #ifndef, #if
#ifdef PI // 如果在宏定義中定義了 PI(ifdef 是 if defined 的簡寫)
    ;
#else // 如果不需要的話,可以不要 #else
    ;
#endif  // #ifdef 和 #endif 必須成對


#ifndef PI // 如果在宏定義中沒有定義 PI(ifndef 是 if not defined 的簡寫)
    ;
#else // 如果不需要的話,可以不要 #else
    ;
#endif // #ifndef 和 #endif 必須成對


#if ISWINDOWS // 如果宏定義 ISWINDOWS 非零則為真(ISWINDOWS 是整型)
    ;
#else // 如果不需要的話,可以不要 #else
    ;
#endif // #if 和 #endif 必須成對



    return float_toString(y);
}


// 這之後不再有 PI 這個宏定義(undef 是 undefine 的簡寫)
#undef PI


2、輸入和輸出
cIO.h

#ifndef _MYHEAD_IO_
#define _MYHEAD_IO_ 

#ifdef __cplusplus  
extern "C"
#endif  

char *demo_cIO();

#endif  

cIO.c

/*
 * 輸入,輸出
 */

#include "pch.h"
#include "cIO.h"
#include "cHelper.h"

void io_printf();
void io_scanf();
void io_getchar();

char *demo_cIO()
{
    // 格式化輸出 printf
    io_printf();

    // 格式化輸入 scanf
    io_scanf();

    // 字符串輸入 getchar()
    io_getchar();

    return "看代碼及注釋吧";
}


// 格式化輸出 printf
void io_printf()
{
    // printf - print formatted,以下僅列一下常用用法
    // printf 的返回值為:實際輸出的字符數

    int a = 88;
    float b = 3.14159;
    char *c = "webabcd wanglei";


    // %d - 以十進制形式輸出帶符號整數
    // %.2f - 以浮點型輸出,取小數點後 2 位
    // %.7s - 以字符串輸出,取前 7 位
    printf("%d, %.2f, %.7s\n", a, b, c);
    // 輸出結果:88, 3.14, webabcd
    // printf 的返回值為 18


    // %o - 以八進制形式輸出無符號整數
    // %#o - 以八進制形式輸出無符號整數,並加前綴 0
    printf("%o, %#o\n", a, a);
    // 輸出結果:130, 0130


    // %x 或 %X - 以十六進制形式輸出無符號整數
    // %#x - 以八進制形式輸出無符號整數,並加前綴 0x
    // %#X - 以八進制形式輸出無符號整數,並加前綴 0X
    printf("%x, %#x, %#X\n", a, a, a);
    // 輸出結果:58, 0x58, 0X58


    // %10.2f - 以浮點型輸出,取小數點後 2 位;顯示寬度至少為 10 位,不夠以空格填充
    printf("%10.2f\n", b);
    // 輸出結果:      3.14(前面有 6 個空格)



    /*
     * 類型說明如下:
     * %d / %i - 整型
     * %o - 無符號八進制
     * %u - 無符號十進制
     * %x / %X - 無符號十六進制
     * %f - 浮點型
     * %e / %E - 科學表示法
     * %g / %G - 在 %f 和 %e/%E 之中選一個最短的形式
     * %c - 字符
     * %s / %S - 按字符串輸出,直至'\0'
     * %p - 以十六進制形式輸出指針
     * %% - %
     *
     *
     * 另外有兩種長度格式:
     * h - 按短整型量輸出,比如:%hd - 按短整型輸出; printf("%hd", 32769) 輸出結果為 -32767
     * l - 按長整型量輸出,比如:%lf - 按 double 輸出; %ld - long int; %lld - long long int
     */
}


// 格式化輸入 scanf
void io_scanf()
{
    // scanf - scan formatted,以下僅列一下常用用法
    // printf 的返回值為:成功接收到的賦值參數的個數

    int a;
    float b;
    char c[100];


    // %2s - 代表輸入字符串時,只取前 2 位
    // 如果在兩個格式化參數之間沒有它字符的話,則可用空格或TAB或回車做間隔
    scanf("%d%f%2s", &a, &b, c);
    // 輸入 1 3.14 webabcd 後的結果為:a 的值為 1,b 的值為 3.14,c 的前 3 個元素為 'w' 'e' '\0'
    // scanf 的返回值為 3


    // 如果在兩個格式化參數之間有它字符的話,則按指定的字符做間隔
    scanf("a=%d, b=%f, c=%s", &a, &b, c);
    // 輸入:a=1, b=3.14, c=webabcd
}


// 字符串輸入 getchar()
void io_getchar()
{
    // 當程序調用 getchar() 函數時,程序就等著用戶按鍵,用戶輸入的字符被存放在鍵盤緩沖區中,直到用戶按回車為止(回車字符也放在緩沖區中)
    // 當用戶鍵入回車之後,getchar() 函數才開始從鍵盤緩沖區中每次讀入一個字符,一直到緩沖區中的字符讀完

    /*
    char c = NULL;
    while ((c == getchar()) != '\n') 
    {
        printf("%c", c);
    }
    */

    // getch(), getche() 之類的需要 conio.h, 但是在 linux 下是沒有的,所以就不寫了
}



OK
[源碼下載]

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved