學習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++要注意的眉角極多,之後再陸續補充紀錄