C语言基础 — 顺序程序设计


1、常量

常量:不能被改变的值

1.1 数字常量

举个简单的栗子:
12,23.4,12.5f 等均是数字常量(字面常量)

12 = 23;  // error
23.4 = 45.6;  // error
1.2 字符常量

举个简单的栗子:
‘\0’,‘0’,‘A’,‘a’,‘\n’ 等均是字符常量
对应的ASCII码值:
在这里插入图片描述

1.3 字符串常量

举个简单的栗子:
“0”,“abcd”

1.4 宏定义

宏定义就是字符替换
【格式】#define 宏名 值
例如:

#define PI 3.14
PI = 3.14159;  // error,等同于3.14 = 3.14159

在这里插入图片描述

1.5 const 常量
const int a = 10;
a = 20;  // error

在这里插入图片描述

2、变量

变量:能被修改的值
定义:数据类型,变量名
例如:

int a = 0; 
a = 10;  // ok

标识符命名规则:

  1. 以字母、下划线_、数字开头
  2. 只能以字母或下划线开头
  3. 不能使用关键字
  4. 区分大小写(对大小写比较敏感)

合法的标识符:abc、a1、_a、a_b、A、Float
非法的标识符:1a、a*b、float

3、数据类型

char short int long longlong float double

char 类型的取值范围: -128 ~ 127
unsigned char 类型的取值范围: 0 ~ 255
char 类似是 mini 的整型

char ch = ‘a’;
printf(“%c, %d\n”, ch, ch); // 输出:a,97
printf(“%c, %d\n”, 98, 98); // 输出:b,98

4、输出函数 printf

常用的格式化符,%d,%c,%f,%s,%x,%X,%08x

printf("%d, %d\n", 98, 'b');  // 输出:98 98. %d 用于输出十进制数
printf("%c, %c\n", 99, 'c');  // 输出:c c. %c 用于输出十进制数
printf("%f, %f\n", 12.5f, 23.4);  // 输出:12.500000 23.400000 98. %f 用于输出float和double
printf("%s\n", "abc");  // 输出:abc. %s 用于字符串的输出
char* str = "hello";
printf("%s\n", str);  // 输出:hello
printf("%x\n", 20);  // 输出:14  %x 用于输出十六进制的数组 0x14 == 20
printf("%x, %X\n", 180, 180);  // 输出:b4, B4
printf("%08x\n", 100);  // 重点,输出00000064.08 表示输出8个十六进制数,不足左边补0

输出结果:
在这里插入图片描述

【常见的错误】

printf("%d\n", 12.5);  // error 格式化符和数据不匹配,应该使用 %f
printf("%d\n");  // error 漏写输出的数据

在这里插入图片描述

5、输入函数 scanf

scanf(“格式化符”, 地址列表);

int a;
int b;
scanf("%d%d", &a, &b);  // 从键盘输入 10 20  读取成功
scanf("%d%d", &a, &b);  // 从键盘输入 10,20  读取b失败
scanf("%d,%d", &a, &b);  // 从键盘输入 10 20  读取b失败
scanf("%d,%d", &a, &b);  // 从键盘输入 10,20  读取成功

scanf("%d%d", a, b);  // 从键盘输入 10,20  程序崩溃
scanf("%d%d\n", &a, &b);  // 从键盘输入 10,20  程序停不下来,直到输入\n
float c;
scanf("%d", &c);  // error 格式化符和数据不匹配,读取float使用%f,读取double使用%lf

【注】scanf 函数非常容易出错,使用 scanf 读取数据后一定要利用 printf 验证一下数据是否读取成功。尽量少使用 scanf 函数

scanf的不安全性

关于为什么VS编译器中会显示 scanf 函数不安全,我们举个简单的栗子:
在这里插入图片描述
【分析】
我们首先定义了一个 char 类型的、大小为5的数组 ar,这时系统会在栈区给数组ar分配5个字节的地址空间
当程序运行时,我们从键盘上输入:“hello world”,这很明显大于5个字节,由于 scanf 函数并不会检查输入值的长度是否会越界访问,所以当我们使用 scanf 函数的时候,会存在数组越界访问的风险,而数组越界访问的后果时非常严重的,它可能导致我们的系统崩溃
但是当我们在 VS 上运行上述代码时,编译器会有 Debug Error 的提示,这样就很好的提示程序员,从而避免输入非法字符串,保证程序的安全、正常运行

解决scanf的不安全问题的几种方法

1. 使用 scanf_s函数替代

int scanf_s(
   const char *format [,
   argument]...
);
// format:格式控制字符串。  argument:可选参数。

举个简单的栗子:

char s[10];
scanf_s("%9s", s, (unsigned)_countof(s)); // buffer size is 10, width specification is 9

2. 使用宏 #define _CRT_SECURE_NO_WARNINGS 1

#define _CRT_SECURE_NO_WARNINGS 1

缺点就是,每次新建一个 .c 源文件都需要在头部加上这个预处理命名,十分繁琐

3. 取消SDL检查

6、其它的输入输出函数

  • getchar:读取一个字符
  • putchar:输出一个字符
  • gets:读取一行字符,这个函数比较危险,不建议使用
  • puts:输出一行字符
char ch;
ch = getchar();  // 从键盘上读取一个字符存放在 ch 中
putchar(ch);  // 输出 ch 中的字符

char str[100];
gets(str);  // 读取一行的字符存放在 str 中
puts(str);  // 输出 str

7、真题演练

int main()
{
	printf("%d\n", printf("0123 "));
	return 0;
}

其输出结果为:
在这里插入图片描述

printf的返回值就是输出的字符数量(包括换行符在内,也算一个字符)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值