printf(格式控制,输出表列) 标准输出函数
scanf(格式控制,地址表列) 标准输入函数
格式控制:d 有符号十进制整数(u为无符号)
o 无符号八进制整数
x、X 无符号十六进制,小、大写abcdef
f 浮点数
c 字符
s 字符串
p 指针
转义字符:/r /n /b /t /f // /' /" /ddd /xhh
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
int i = 10;
//把i的地址强转成int型赋给j
int j = (int)&i;
//把j的地址强转成int型赋给i
i = (int)&j;
//输入一个整数到j的地址
scanf("%d", i);
//原本j的值为i的地址,但是通过上面scanf语句改变了j的值
//此句的j不为地址,或者说那个整数地址不可访问,编译器报错
scanf("%d", j);
system("pause");
return 0;
}
说到scanf关于格式控制%s必须要注意
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
//字符串
char szName[10];
char szPassword[10];
//输入用户名 123456
printf("请输入用户名:");
//s前+数字控制长度
scanf("%9s", szName);
//输入密码 1234567890123
printf("请输入密码 :");
//没有控制
scanf("%s", szPassword);
printf("%s,%s/r/n", szName, szPassword);
system("pause");
return 0;
}
输出结果为:3,1234567890123
为什么结果是这样呢?
当前面定义字符串语句的时候系统为szName和szPassword分配了一片空间
0012FF68 CC CC CC CC
0012FF6C CC CC CC CC
0012FF70 CC CC CC CC 输入用户名123456变化
0012FF74 CC CC CC CC => 31 32 33 34
0012FF78 CC CC CC CC => 35 36 00 CC
0012FF7C CC CC CC CC => CC CC CC CC
从上面可以看出字符串szName的首地址为0012FF74,字符串以字符'/0'结尾
输入密码1234567890123变化
0012FF68 CC CC CC CC => 0012FF68 31 32 33 34
0012FF68 CC CC CC CC => 0012FF6C 35 36 37 38
0012FF68 CC CC CC CC => 0012FF70 39 30 31 32
0012FF74 31 32 33 34 => 0012FF74 33 00 33 34
0012FF78 35 36 00 CC => 0012FF78 35 36 00 CC
0012FF7C CC CC CC CC => 0012FF7C CC CC CC CC
从上面可以看出除了CC改变以外,0012FF74 0012FF75地址里的值也发生了改变
然后以szPassword首地址为0012FF68,以字符'/0'结尾。
可得szPassword为1234567890123(31 32 33 34 ... 33 00)
再以szName首地址为0012FF74,以字符'/0'结尾。
可得szName为3(33 00)
好啦!这节还是比较有趣的,printf,scanf一些具体的格式控制详见MSDN。