格式化输出与数据类型
俗语说浅水淹死人,作为Hello World的第一门必修语法,格式化输出就是这样的存在。明明熟背在心,隔几个礼拜不print就只记得print和printf了,每次要用都要上网再查一次。干脆在这篇博文,简单归纳一下C语言、python两大块常用的格式化输出语法。
参考文章: 《printf()用法详解》 《简述strcpy、sprintf、memcpy》 《C/C++中volatile关键字详解》
C语言 printf sprintf fprintf
printf
最简单用法: 1
printf("Hello World")
1
2
3
4
5
6
7
8
9参数 数据类型 说明
%d(%i) int 十进制有符号32bits整数
%u unsigned int 无符号十进制整数
%o unsigned int 无符号8进制(octal)整数
%x(%X) unsigned int 无符号16进制整数(%x表示字母部分为小写,X为大写)
%f float 单精度浮点数(默认6位,自定义"%.nf")
%lf double 双精度浮点数(默认6位)
%c char 根据数字寻找对应ASCII码字符
%s char* 字符串
sprintf strcpy()
字符串打印函数,printf是将数据打印到终端或者输出,而sprintf是将字符串打印到字符串变量;例如:
1
2
3char test[12];
sprintf(test,"Hello World"); //Hello World打印到test中,但是不会输出到终端
printf("%s",test); //打印到终端1
2
3
4
5char test1[12];
sprintf(test1,"Hello World1"); //复制函数
printf("%s",test1); //打印到终端
输出:Hello World11
2
3
4
5
6
7
8
9char a[16];
char b[16]="Hello Eden";
char c[16];
sprintf(a,"%s",b);
printf("%s",a); //打印到终端
strcpy(c,b);
printf("%s",c); //打印到终端
输出:Hello Eden;Hello Eden;1
2
3
4
5
6char a[15];
char b[15]="hello";
strncpy(a,b,3);
printf("%s",a);
输出:hel
fprintf
fprintf主要是用于文件操作 1
2
3
4
5
6
7
8char name[10] = "Eden";
FILE *file;
file = fopen( "output.txt", "w" );
if( file != NULL )
fprintf(file, "Hello %s\n", name);
fclose(file);
响应:本地生成output.txt,打开看到字符串Hello Eden
Python print
对于Python的print就无需长篇大论叙述了,上述内容已经完成了很好的叙述基础,包括参数等都是高级程序语言一脉相承的。
最简单用法: 1
2
3
4print("Hello World") #字符
#甚至无需格式化打印数据
a=10
print(a)1
2
3Name="Eden"
Score=59
print("我的名字是:%s,我的成绩是:%d"%(Name,Score))1
2
3Name="Eden"
Score=59
print("我的名字是:{},我的成绩是:{}".format(Name,Score))
数据类型
记录了在系统中常用的数据类型重定义 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19typedef unsigned char uint8; // 无符号 8 bits
typedef unsigned short int uint16; // 无符号 16 bits
typedef unsigned int uint32; // 无符号 32 bits
typedef unsigned long long uint64; // 无符号 64 bits
typedef signed char int8; // 有符号 8 bits
typedef signed short int int16; // 有符号 16 bits
typedef signed int int32; // 有符号 32 bits
typedef signed long long int64; // 有符号 64 bits
typedef volatile uint8 vuint8; // 易变性修饰 无符号 8 bits
typedef volatile uint16 vuint16; // 易变性修饰 无符号 16 bits
typedef volatile uint32 vuint32; // 易变性修饰 无符号 32 bits
typedef volatile uint64 vuint64; // 易变性修饰 无符号 64 bits
typedef volatile int8 vint8; // 易变性修饰 有符号 8 bits
typedef volatile int16 vint16; // 易变性修饰 有符号 16 bits
typedef volatile int32 vint32; // 易变性修饰 有符号 32 bits
typedef volatile int64 vint64; // 易变性修饰 有符号 64 bits
主要说明两点: 1 有符号和无符号:
无符号表明数据全部用于表示值,例如uinit8可以表示8位数据,即0-2^8-1,所以赋值256是非法的;而如果是有符号,高位表示符号位,数据位就剩下7位,范围就分布在正负区间,int8范围应该是-128-127;
2
volatile是用于修饰变量的关键字,指明该变量能够被编译器意料之外的因素修改,如操作系统、多线程等,能避免编译器对其进行优化导致变量修改失效。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void main()
{
int i = 10;
int a = i;
printf("i = %d", a);
__asm {
mov dword ptr [ebp-4], 20h // 通过汇编语句改变内存中 i 的值
}
int b = i;
printf("i = %d", b);
}