1、字符常量,例如'a'
2、字符串常量"hello";(字符串后面会自动追加'\0'字符,相当于hello\n)
3、浮点类型常量:3.1415926
4、指数常量:3*10^8->3e8
5、宏:格式:#define 宏名 常量或表达式 注:一般宏名大写为了便于区分
注意宏的运算是直接替换的,如果需要有先后顺序,应该用()来修饰,例如
#define A 2
#define B 2+3
#define C A+B/2
A+B+C的结果将是2+2+3/2=5
如果想先算A+B的话应该用定义C宏时应该是(A+B)/2
1、getchar()与putchar()
getchar()是用来获取一个字符的
putchar(int c)是用来输出一个字符的,也可以输入Ascii码值。
注:电脑中的字符都是用Ascii码进行存储的,常见的‘\0’是0,'\n'是10,空格是32,数字0~9是48~57,A是65,Z是97,字符转数字减48,大写转小写+32;
putchar(10);//即输出\n
2、printf()与scanf()
printf("格式字符串",待打印项)//输出
scanf("格式字符串",变量地址)//输入
格式字符串有%d(整型)、%c(char类型)、%f(float类型)、%lf(double类型)、%e(指数类型)、%u(无符号类型)、%#x(以16进制输出)、%#o(以8进制输出)、%s(字符串)
int a=0;
scanf("%d",&a);//&是取地址的意思,输入一个整型数存在a变量中
printf("%d\n",a);//将a变量中的内容输出在屏幕上,\n代表换行
但是当我要输入字符串的时候,scanf遇到空格就会结束输出,比如我输入ab,他会输出ab,但是当我输入a b,他仅仅会输出a。
char a,b;
scanf("%c%c",&a,&b);
printf("%d%d",a,b);//如果输入ab会输出ab,但如果输入a b,就会输出a
//因为当输入a后,空格被b读入,没有输入b的机会就会结束了,b就等于空格
可以采用
scanf("%c %c",&a,&b);//在%c中间加一个空格,可以吃掉输入字符多余的tab 空格 \n键
我们也经常使用getchar()去吃掉缓冲区一个多余的字符,常在循环中使用
注:说一下一维数组和二维数组
一维数组用来表示一组内存连续的同类型存储区,这些存储区叫做数组元素
格式:数据类型 数组名[元素个数]={初始化};
例如:int buf [3]={1,2,3};//申请一个int类型的数组,全部初始化buf[0]是1,buf[1]是2,buf[2]是3,没有buf[3],只有三个元素,如果这样就下标越界了
如果不初始化的话数组元素是随机值,也可以部分初始化,其他的数组元素被初始化为0
例如:int buf[3]={1};//除了buf[0]是1,其他为0;
也可以用scanf("%[^\n]",a);//a代表数组首地址 int a[100]={0};向a数组中输入字符,只有遇到回车时才结束输入
二维数组和一维数组没什么太大的区别,多了行和列,一维数组只有一行,二维数组可以有多行
例如:int buf[2][3]={1,2,3,4,5,6};相当于申请了一个2行3列的二维数组,buf[行下标0~1][列下标0~2],第一行元素依次赋值,之后第二行以此类推。也可以部分初始化,不初始化依然是随机值
申请二维数组时是可以省略行下标的,但不可以省略列下标。
这里说一下输入和输出缓冲区
我们输入的东西都不会立即被发送到终端,他会先存放在一个缓冲区内,叫做输入缓冲区,然后再使用输入缓存区的数,是进入的先被处理,没被处理的将会留在输入缓存区下一次被处理
比如输入2.8,但是输出的是整型,那么会把0.8留下缓冲区无法执行下一次输入
清空缓存区可以使用scanf("%*[^\n]"); scanf("%*c");
正常我们每次输入字符的时候最好输入完清空一下缓冲区再进行第二次输入;
同样我们输出的东西也不会立即发送到屏幕上,也会先进入输出缓存区,printf其实只是把输出放在输出缓冲区中,只有以下几种情况,会把输出缓冲区的内容输出到屏幕上
① 输出缓冲区有'\n'字符,把它前面内容显示出来
② 程序结束后会把输出缓冲区的内容显示出来
③ 缓冲区充满时
④ 用fflush(stdout)强制显示
⑤ scanf函数也会将缓冲区内容显示到屏幕上
注:最近发现printf的待打印项是从右向左执行的,例如
int a=0;
printf("%d %d",a,++a);//先执行++a,再打印,因此都是1
printf("%d %d",++a,a);//这就先执行a,再执行++a,因此打印的是1 0
3、gets()、puts()、fgets()
int buf[32]={0};
gets(buf);//将输入的内容存在buf中,但gets使用时不会检查数组越界问题,比较危险,会报警告
puts(buf);//将buf的内容以字符串的形式输出;
fgets(buf,32,stdin);//可以作为gets的替代,第一个参数传入数组地址,第二个参数传入数组大小,第三个参数代表从键盘输入的意思;
但是如果不把字符数组充满的情况下,会包括一个空行,因为回车会作为‘\n’字符保留在输入缓冲区里,如果用户输入的内容超过了数组范围,就把数组里放不下的部分放在了输入缓冲区里
如果用户想要再次从键盘获得数字就必须把上述内容删除
应该在一个分支里删除输入缓冲区的多余数据,如果字符串不能把数组充满,则程序无东西可删,也不能继续执行因此分支可以写成
if(strlen(buf)==31&&buf[30]!='\n'){
scanf("%*[^\n]);
scanf("%*c");
}如果buf中的有效字符为31个,并且第31个字符不是\n,那说明第32个字符是‘\0’,也就是说至少有一个\n留在了输入缓冲区里
注:strlen(buf),是计算有效数据的个数,不包括‘\0’;
顺便在这说一下sizeof和strlen的区别把
1、sizeof是关键字,而strlen是一个函数
2、sizeof计算的时候算的是类型的大小,而strlen算的是有效数据的大小,例如
char arr[32]="hello";
sizeof(arr);//是32个字节
strlen(arr);//是5个字节
3、sizeof计算字符串大小时计算‘\0’,strlen则不计算,例如
char*msg="hello";
sizeof(msg);//6,因为字符串后会追加\0
strlen(msg);//5,算的是实际字符