前往
大廳
主題

一切都是從Hello World開始

Yang | 2022-12-25 13:52:50 | 巴幣 0 | 人氣 261

學習C/C++應該都是從Hello World開始,在此紀錄相關範例,希望在不同平台(目前只測試Win10/CentOS7)都跑出相同結果,結果一測就爆炸了!因此也紀錄相容性方面的眉角

寫C也要考慮安全性和效能方面的問題,也記錄在此


#include <cstring>
#include <stdio.h>
#include <unistd.h>

//清空scanf的輸入緩衝區
//取代fflush(stdin),參考
//scanf會先把輸入資料儲存在一個看不見的緩衝區,每次呼叫scanf後要先清空緩衝區,否則會干擾下次的呼叫
//fflush(stdin)能通過編譯,但在CentOS7沒作用,可能是舊版gcc(4.x)不支援
//CleanStdin效果相同,跨平台測試正常
void CleanStdin()
{
    int c;

    do {
        c = getchar();
    } while (c != '\n' && c != EOF);
}

int main(const int argc, const char *argv[]) //安全性考量,不會異動的輸入參數,宜養成宣告為const的習慣
{
    printf("Hello World!\r\n"); //不引用iostream,因此沒cin/cout可用,iostream聽說效能不佳,相關測試之後補充
    
    //程式碼為了能跨平台,換行符號先用"\r\n",之後再找機會移植到更多平台測試

    //顯示基本資料類型占用的記憶體大小,不同平台和編譯設定會有影響,須小心注意
    printf("sizeof(char)=%i\r\n", sizeof(char));
    printf("sizeof(short)=%i\r\n", sizeof(short));
    printf("sizeof(int)=%i\r\n", sizeof(int));
    printf("sizeof(long)=%i\r\n", sizeof(long)); //不同平台測試遇過4和8,原因待查
    printf("sizeof(long long)=%i\r\n", sizeof(long long));
    printf("sizeof(float)=%i\r\n", sizeof(float));
    printf("sizeof(double)=%i\r\n", sizeof(double));
    printf("sizeof(void *)=%i\r\n", sizeof(void *)); //指標大小,理論上,32位元平台是4,64位元平台是8
    
    //以下利用scanf卡畫面,避免printf結果一閃而逝,來不及閱讀

    char inputBuf1[8];
    memset(inputBuf1, 0, sizeof(inputBuf1));
    //不使用bzero初始或重設資料,bzero非標準,可能無法在不同平台上編譯

    //"%7s",不引用string,string聽說效能不佳,相關測試之後補充
    const char iB1Fmt[] = {'%', sizeof(inputBuf1) - 1 + '0', 's', 0};

    int scanfResult = -1; //scanf正常運作時會回傳1,尚不清楚如何引發異常,之後再測試

    printf("\r\nPress any key to continue.\r\n");
    memset(inputBuf1, 0, sizeof(inputBuf1));
    scanfResult = scanf(iB1Fmt, inputBuf1);
    CleanStdin();
    printf("scanfResult=%i|len=%li|input=%s|\r\n", scanfResult, strlen(inputBuf1), inputBuf1);

    printf("\r\nPress any key to exit.\r\n");
    memset(inputBuf1, 0, sizeof(inputBuf1));
    scanfResult = scanf(iB1Fmt, inputBuf1);
    CleanStdin();
    printf("scanfResult=%i|len=%li|input=%s|\r\n", scanfResult, strlen(inputBuf1), inputBuf1);

    usleep(8 * 1000 * 1000);
    return 0;
}

以上程式碼,在Win10/CentOS7編譯正常
除了sizeof(long),其他測試在Win10/CentOS7結果一至

C/C++要注意的眉角極多,之後再陸續補充紀錄
送禮物贊助創作者 !
0
留言

創作回應

更多創作