在写这个小工具之前我们先了解一下命令行参数。 命令行参数。 什么是命令行参数?应用程序在命令行方式执行时,以字符串数组的形式传递给main方法的参数。 一般格式(运行应用程
在写这个小工具之前我们先了解一下命令行参数。
命令行参数。什么是命令行参数?应用程序在命令行方式执行时,以字符串数组的形式传递给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"。
查看基本数据类型数据在内存中的存储表示小工具//显示一个字节的8位
void showByte(char ch)//参数:传入一个字节
{
/*利用移位实现*/
for (int i = 7; i >= 0; --i)
{
printf("%d",(ch >> i) & 1);//注意:对ch移位并不会改变ch原有的值,因为没有赋值
}
printf(" ");
}
void showByte(char ch, int n)//参数1:传入一个字节。参数2:输出一个字节要显示的位数
{
/*利用递归实现*/
if (n == 0)
{
printf(" ");
return;
}
else
{
showByte(ch >> 1, n - 1);
printf("%d",ch & 1);
}
}
/*利用共用体和字段实现*/
union uct
{
char ch;
struct bt//字段
{
unsigned char b0 : 1;
unsigned char b1 : 1;
unsigned char b2 : 1;
unsigned char b3 : 1;
unsigned char b4 : 1;
unsigned char b5 : 1;
unsigned char b6 : 1;
unsigned char b7 : 1;
}bit;
}uc;
void showByte_a(char ch)//参数:传入一个字节
{
uc.ch = ch;
printf("%d%d%d%d%d%d%d%d ", uc.bit.b7, uc.bit.b6, uc.bit.b5, uc.bit.b4,
uc.bit.b3, uc.bit.b2, uc.bit.b1, uc.bit.b0);
}
void showByte_b(char ch)//参数:传入一个字节
{
/*利用查表法实现*/
const char* t[] = { "0000","0001", "0010","0011",
"0100","0101","0110","0111","1000","1001","1010",
"1011","1100","1101","1110","1111" };
printf("%s%s ", t[(ch >> 4) & 0xf], t[ch & 0xf]);//将传入的参数分为高四位与第四位,在表中查找相对应的值并输出
}
int main(int argc ,char* argv[])
{
/*用法: -h/-b 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; // 默认查看的数据占的字节数
bool isBinary = 1;//默认为查看二进制
if (!strcmp("-h", argv[1]))
{
//查看方式为-h,十六进制
isBinary = 0;
}
else if(!strcmp("-b", argv[1]))
{
//查看方式为-b,二进制
isBinary = 1;
}
if (!(argc == 4 || argc == 5))
{
printf("参数输入有误\n");
exit(0); //退出整个程序
}
//判断参数类型
if (!strcmp("char", argv[2]))
{
strcpy(u.ch, argv[3]);
size = strlen(u.ch);
}
else if(!strcmp("short",argv[2]))
{
u.s = atoi(argv[3]);
size = sizeof(u.s);
}
else if (!strcmp("int", argv[2]))
{
u.i = atoi(argv[3]);
size = sizeof(u.i);
}
else if (!strcmp("long", argv[2]) && !strcmp("long", argv[3]))
{
u.ll = atol(argv[4]);
size = sizeof(u.ll);
}
else if (!strcmp("long", argv[2]))
{
u.l = atoll(argv[3]);
size = sizeof(u.l);
}
else if (!strcmp("float", argv[2]))
{
u.f = atof(argv[3]);
size = sizeof(u.f);
}
else if (!strcmp("short", argv[2]))
{
u.d = atof(argv[3]);
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[2]))//字符要分开输出,因为其他类型是用小端机存储,所以得倒序输出。
{
for (char* p = u.ch; p < u.ch + size ; ++p)
{
if (isBinary)
{
//二进制输出
showByte_b(*p & 0xff);
}
else
{
//十六进制输出
printf("%02x ", *p & 0xff);
}
}
}
else //其他类型数据
{
for (char* p = u.ch + size -1 ; p >= u.ch; --p)
{
if (isBinary)
{
//二进制输出
showByte_b(*p & 0xff);
}
else
{
//十六进制输出
printf("%02x ", *p & 0xff);
}
}
}
system("pause");
return 0;
}
在vs里面如和输入命令行参数:
项目---》属性---》调试---》命令行参数;然后直接输入你要输入的命令行参数,然后就可以直接进行调试了