2.6.1字符变量的定义和输出
char的本质就是一个1字节大小的整型
#include<stdio.h>
int main(int argc,char *argv[])
//1、内存中没有字符,只有数字
//2、一个数字,对应的一个字符,这种规则就是ascii
//3、使用字符或数字给字符变量赋值是等级
//4、字符类型本质上就是1个字节大小的整型
//此文中出现单引号是为了方便,不加不影响运行
//字符:‘一个字符’
char ch=’a';
printf("ch1 =%c, ch = %d\n", ch, ch);
ch=97;//以ascii赋值,和ch='a'等价的
printf("ch2 =%c\n",ch);
效果:
//小写字母比大写字母大32
char a = 'A';
char b = 'a'
printf("A = &d, a = %d\n", a, b);
效果:
//小写转大写,小写字母-32
printf("小写转大写: %c\n", 'a' - 32);
//大写转小写,大写字母+32
printf("大写转小写: %c\n", 'A' +32)
效果;
2.6.3 转义字符
//字符,原则上",内部只有一个字符,转义字符除外
//char a='abc';//不合理
//转义字符,由反斜杠\组成的多个字符
char ch='\n';//换行符
printf("ffff%c", ch);
ch='\r'; //光标切换到句首
printf("abcddd%cefg\n",ch);
ch='b';//退格
printf("12%c3456\n", ch);
2.6.4 数值溢出
2.7实型(浮点型):foat、double
·尽量不要使用,使用不准确
float存储不准确例子:
{
float a=100.9f;
printf("%f\n", a);
return 0;
}
float正确使用方法:
{
float a;
printf("请输入float:");
scanf("%f", &a);
printf("%f\n", a);
return 0;
}
double的使用方法:
{
double b;
b = 3.14;
printf("b = %lf\n", b);
return 0;
}
2.8 类型限定符
限定符 含义
extern 声明一个变量,sxtexm声明的变量没有建立存储空间。
const 定义一个常量,常量的值不能修改。const int a= 10;
volatile 防止编译器优化代码(加上这个,可以防止编译器跳过中间步骤)
register 定义寄存器变量,提高效率。register是建议型的指令,而不是 命令型的指令,如果 CPU有空闲寄存器,那么register 就生 效, 如果没有空闲寄存器, 那么register 无效。
2.9 字符串格式化输出和输入
2.9.1字符串常量
·定义:字符串是内存中一段连续的char空间,以‘\0'(数字0)结尾
每个字符串的结尾,编译器会自动的添加一个结束标志位’\ 0’,即"a”包含两个字符’ a' 和’\0’
2.9.2 prntf 函数和 putchar 函数
1.输入:printf("mike = %s\n", "s");
输出:mike = s
2.输入:int a = 10;
printf("&a = %p\n", &a);
输出:&a = 0x7ffd6e216b14
//&+字符,用于查询字符的地址,且每次运行后地址都会改变
3.输入:printf("% \n"); //这样输出会有警告,虽然可以运行出%
//%+内容,才是表示输出内容(比如%d,%c)
输入:printf("%%d\n");
输出:%d
//%%在屏幕输出一个%,后面的d也会输出
4.输入:int a = 123
printf("a1 = %d\n", a);
输出:a1 = 123
输入:printf("a2 = '%5d'\n", a);
//%5d,以5个字符输出,没有的字符以空字符填充,默认是右对齐
输出:a2 = ' 123'
输入:printf("a3 = '%05d'\n", a);
//%05d,以5个字符输出,没有的字符以0填充,默认是右对齐
输出:a3 = '00123'
输入:printf("a4 = '%-5d'\n", a);
//%-5d,以5个字符输出,没有的字符以空字符填充,-代表指定为左对齐
输出:a4 = '123 '
输入:printf("a5 = '%-05d'\n", a);
//0 和 - 不能同时使用
输出:a5 = '123 '
输入:double b = 3.14;
printf("b1 = %lf\v", b);
//默认小数点后面6位,不够补0
输出;'b1 = 3.140000'
输入:printf("b2 = '%8.3lf\n", b);
//8.3,8代表总共有8个字符,3代表小数点后有3位,默认右对齐
输出:b2 = ' 3.140'
putchar是将内容输出到屏幕
输入之前:edu@edu:-/share/c code/day05$
输入:char ch = 'a';
putcahr(ch); //把ch的内容输出到屏幕
输出:aedu@edu:-/share/c code/day05$
实现换行:
输入char ch = 'a'
putchar(ch); //不可以输入putchar(“ch\n”)来实现换行,因为对于()内的是变量
//可以输入printf("\n“)来实现换行
putchar('\n');
2.9.3 scanf函数与 getchar函数
scanf:
输入:int a;
printf("请输入a:");
scanf("%d", &a);
printf("a = %d\n",a);
输出:请输入a:x
a = x
输入: int b;
int c;
printf("请输入b,c:")
scanf("%d %d",&b,&c);
printf("b = %d, c = %d\n",b,c);
输出: 请输入b, c:20 30 //此处输出时需要空一行
b = 20 c = 30
输入:char a;
printf("请输入字符a:");
scanf("%c", &a);
printf("a = '%c'\n:, a); //如果代码到这里,则会正常运行
char b;
printf(请输入字符b:);
scanf("%c", &b);
printf("b = '%c'\n", b); //如果代码到这里,则会只有上一步的代码正常运行
效果:
//知识点:此处当用户输入字符时,编译器默认把输入的内容先放在一块内存中(缓冲区),scanf()自动在缓冲区读完内容
键盘输入的会进入缓冲区
scanf("%c",&a); 只读一个字符
1、第1次把t取走,留下\n还在缓冲区
2、第2次scanf,由于缓冲区还有内容所以直接取内容,无需输入(相当于第二次把\n这个指令,也就是换行给读取了)
接下来进行第三次输入:
char c;
printf(”请输入字符c:");
scanf("%c, &c");
printf("c = '%c '\n", c);
输出:a = x
b = y
c = z
或者:把第二个命令的printf都给删去,为的是吃掉上一步的\n,不做处理
如下:
char b;
scanf("%c", &b );
getchar:
简单理解来说也是输入
a = getchar(); //读取键盘的字符,放在变量a(相当于scanf)
b = getchar;
c= getchar;
输入:char a ;
printf("请输入字符a:");
a = getcahr();
printf("c = '%c'\n, c");
输出: a = x