檢視基本資料型別資料在記憶體中的儲存表示小工具
阿新 • • 發佈:2022-04-11
在寫這個小工具之前我們先了解一下命令列引數。
命令列引數。
什麼是命令列引數?應用程式在命令列方式執行時,以字串陣列的形式傳遞給main方法的引數。
一般格式(執行應用程式時) : 應用程式名 串1 串2 ...... 串n
按國際標準,c程式標準的main函式頭只有兩種:
1、不帶命令列引數。
int main(void)
{
}
2、帶命令列引數。
int main(int argc,char* argv[]) { //argc:命令列引數的個數 argument count //char *argv[]:argument vector陣列,每個元素char* 字串。 //第二個引數也可以寫成char** argv。 }
特別注意:c語言中命令列執行時:程式名 字串1 字串2 ...... 字串n。
argv[0] = "程式名.exe" argv[1] = "字串1" ...... argv[argc - 1] = "字串n"。
檢視基本資料型別資料在記憶體中的儲存表示小工具
int main(int argc ,char* argv[]) { /*用法: char/short/int/long/long long/float/double 待檢視的資料*/ union //共用體 { char ch[81]; short s; int i; long l; long long ll; float f; double d; }u; int size = 1; // 預設檢視的資料佔的位元組數 if (!(argc == 3 || argc == 4)) { printf("引數輸入有誤\n"); exit(0); //退出整個程式 } //判斷引數型別 if (!strcmp("char", argv[1])) { strcpy(u.ch, argv[2]); size = strlen(u.ch); } else if(!strcmp("short",argv[1])) { u.s = atoi(argv[2]); size = sizeof(u.s); } else if (!strcmp("int", argv[1])) { u.i = atoi(argv[2]); size = sizeof(u.i); } else if (!strcmp("long", argv[1]) && !strcmp("long", argv[2])) { u.ll = atol(argv[3]); size = sizeof(u.ll); } else if (!strcmp("long", argv[1])) { u.l = atoll(argv[2]); size = sizeof(u.l); } else if (!strcmp("float", argv[1])) { u.f = atof(argv[2]); size = sizeof(u.f); } else if (!strcmp("short", argv[1])) { u.d = atof(argv[2]); size = sizeof(u.d); } //輸出在記憶體中的表示 if (!strcmp("char",argv[1])) { for (int i = 0; i < size; ++i) { printf("%02x ", u.ch[i] & 0xff); } } else { //倒序輸出是因為採用了小端機儲存,如果正序輸出資料就會反過來表示 for (int i = size - 1; i >= 0; --i) { printf("%02x ", u.ch[i] & 0xff); } } //或者也可以使用指標輸出 /* * if (!strcmp("char",argv[1])) * { * for (char* p = u.ch; p < u.ch + size ; ++p) * { * printf("%02x ", *p & 0xff); * } * } * else * { * for (char* p = u.ch + size -1 ; p >= u.ch; --p) * { * printf("%02x ", *p & 0xff); * } * } */ system("pause"); return 0; }
在vs裡面如和輸入命令列引數:
專案---》屬性---》除錯---》命令列引數;然後直接輸入你要輸入的命令列引數,然後就可以直接進行除錯了