如何建设小说网站大理建设工程信息网站
news/
2025/10/9 14:06:52/
文章来源:
如何建设小说网站,大理建设工程信息网站,做视频网站注意事项,做一个网站建设需要多少钱C语言数据类型和变量 前言1. 数据类型介绍1.1 字符型1.2 整型1.3 浮点型1.4 布尔类型1.5 各种数据类型的长度1.5.1 sizeof操作符1.5.2 数据类型长度1.5.3 sizeof中表达式不计算 2. signed 和 unsigned3. 数据类型的取值范围4. 变量4.1 变量的创建4.2 变量的分类 5. 算术操作符、-、*、/、%5.1 和 -5.2 *5.3 / 6. 赋值操作符和复合赋值6.1 连续赋值6.2 复合赋值符 7. 单目操作符、--、、-7.1 和--7.1.1 前置7.1.2 后置7.1.3 前置--7.1.4 后置-- 7.2 和 - 8. 强制类型转换9. scanf和printf介绍9.1 printf9.1.1 基本用法9.1.2 占位符9.1.3 占位符列举9.1.4 输出格式9.1.4.1 限定宽度9.1.4.2 总是显示正负号9.1.4.3 限定小数位数9.1.4.4 输出部分字符串 9.2 scanf9.2.1 基本用法9.2.2 scanf的返回值9.2.3 占位符9.2.4 赋值忽略符 前言
本文基于VS2022将介绍一系列的C语言数据类型和变量让读者对C语言有一个初步的了解并对后续的学习做下铺垫。 大家有没有想过为什么要编程? 可能每一个人的答案都不一样但我想说编程不只是为了解决实际生活中的困难还是为了追求更美好的明天追求你一直想要追求的梦想不要害怕追随你的梦想因为成功只会往那些敢于梦想并且敢于去追求梦想的人身上涌来。只有不停奋斗才能拥有更美好的未来。 1. 数据类型介绍
C语言提供了丰富的数据类型来描述生活中的各种数据。 使用整型类型来描述整数使用字符类型来描述字符使用浮点型类型来描述小数。 所谓“类型”就是相似的数据所拥有的共同特征编译器只有知道了数据的类型才知道怎么操作数据。
下面盘点一下C语言提供的各种数据类型本章节主要探讨内置数据类型。 下面所提及的数据类型 ——放在大括号里的指的是可以不写的可省略的 1.1 字符型
char //character
[signed] char //有符号
unsigned char //无符号1.2 整型
//短整型
short [int]
[signed] short [int]
unsigned short [int]//整型
int
[signed] int
unsigned int//⻓整型
long [int]
[signed] long [int]
unsigned long [int]//更⻓的整型
//C99中引⼊
long long [int]
[signed] long long [int]
unsigned long long [int]1.3 浮点型
float //单精度浮点型
double //双精度浮点型
long double //精度更高型1.4 布尔类型
C语言原来并没有为布尔值单独设置一个类型而是使用整数 0 表示假非零值表示真。 在 C99 中也引入了 布尔类型 是专门表示真假的 _Bool布尔类型的使用得包含头文件 stdbool.h 布尔类型变量的取值是true或者false.
#define bool _Bool
#define false 0
#define true 1代码演示
int main()
{//1. C语言中0表示假非0表示真if (2 11)printf(hehe\n);return 0;
}_Bool flag true;//也可以将_Bool 换成 bool
if (flag)printf(i like C\n);1.5 各种数据类型的长度
每一种数据类型都有自己的长度使用不同的数据类型能够创建出长度不同的变量变量长度的不同存储的数据范围就有所差异。 计算机能够识别的是二进制 1、0 1.5.1 sizeof操作符
sizeof是一个关键字也是操作符专门是用来计算sizeof操作符数的类型长度的单位是字节 sizeof 操作符的操作数可以是类型也可是变量或者表达式
sizeof( 类型 )
sizeof 表达式sizeof的操作数如果不是类型是表达式的时候可以省略掉后边的括号的。 sizeof 后边的表达式是不真实参与运算的根据表达式的类型来得出大小。 sizeof的计算结果是size_t类型 关于size_t 的解释 sizeof运算符的返回值C 语言只规定是无符号整数并没有规定具体的类型而是留给系统自己去决定 sizeof 到底返回什么类型。不同的系统中返回值的类型有可能是unsigned int 也有可能是 unsigned long 甚至是 unsigned long long 对应的 printf() 占位符分别是 %u 、 %lu 和 %llu 。这样不利于程序的可移植性。 C 语言提供了一个解决方法创造了一个类型别名 size_t 用来统一表示 sizeof 的返回值类型。对应当前系统的 sizeof 的返回值类型可能是 unsigned int 也可能是unsigned long long 比如
#include stdio.h
int main()
{int a 10;printf(%zd\n, sizeof(a));printf(%zd\n, sizeof a);//a是变量的名字可以省略掉sizeof后边的()printf(%zd\n, sizeof(int));printf(%zd\n, sizeof(3 3.5));return 0;
}sizeof 的计算结果返回值的单位是字节 关于计算机的单位 可看 数据的存储单位 1.5.2 数据类型长度
#include stdio.h //%zd是无符号数
int main()
{printf(%zd\n, sizeof(char));printf(%zd\n, sizeof(_Bool));printf(%zd\n, sizeof(short));printf(%zd\n, sizeof(int));printf(%zd\n, sizeof(long));printf(%zd\n, sizeof(long long));printf(%zd\n, sizeof(float));printf(%zd\n, sizeof(double));printf(%zd\n, sizeof(long double));return 0;
}
在VS2022 X64配置下的输出
1
1
2
4
4
8
4
8
8C语言规定 sizeof(long ) sizeof(int) 注意要点
int main()
{int a 10;printf(%zd\n, sizeof a); //如果sizeof里是变量括号可以直接省略不写printf(%zd\n, sizeof(a));//sizeof里放变量是返回的是数据类型的大小printf(%zd\n, sizeof(int));//如果是类型则不可以省略printf(%zd\n, sizeof(3.14));//doubleprintf(%zd\n, sizeof(3.14f));//floatreturn 0;
}不同编译器下的数据类型长度类型16位编译器32位编译器64位编译器char111char*248short222int244unsigned int244float444double888long448long long888unsigned long448
1.5.3 sizeof中表达式不计算
#include stdio.h
int main()
{short s 2; //占两个字节int b 10;printf(%d\n, sizeof(s b1)); // b是4个字节 整型 1 也是整型 而s是短整型 是2个字节故是2printf(s %d\n, s);return 0;
}sizeof在代码进行编译的时候就根据表达式的类型确定了类型的常用而表达式的执行却要在 程序运行期间才能执行在编译期间已经将sizeof处理掉了所以在运行期间就不会执行表达式
2. signed 和 unsigned
C 语言使用 signed 和 unsigned 关键字修饰字符型和整型类型的。 signed 关键字表示一个类型带有正负号包含负值 unsigned 关键字表示该类型不带有正负号只能表示零和正整数。 对于 int 类型默认是带有正负号的也就是说 int 等同于 signed int 。 由于这是默认情况关键字 signed 一般都省略不写但是写了也不算错。 关于正负 的区分 有符号最高位 是符号位 signed int a;
// 等同于int a;int类型也可以不带正负号只表示非负整数。这时就必须使用关键字unsigned 声明变量。 unsigned int a;整数变量声明为 unsigned 的好处是同样长度的内存能够表示的最大整数值增大了一倍。 比如16位的 signed short int 的取值范围是-32768~32767最大是32767 而 unsigned short int 的取值范围是0~65535最大值增大到了65,535。 32位的 signed int 的取值范围可以参看 limits.h 中给出的定义。 下面的定义是VS2022环境中limits.h中相关定义
#define SHRT_MIN (-32768) //有符号16位整型的最⼩值
#define SHRT_MAX 32767 //有符号16位整型的最⼤值
#define USHRT_MAX 0xffff //⽆符号16位整型的最⼤值
#define INT_MIN (-2147483647 - 1) //有符号整型的最⼩值
#define INT_MAX 2147483647 //有符号整型的最⼤值unsigned int 里面的 int 可以省略所以上面的变量声明也可以写成下面这样。 unsigned a;字符类型 char 也可以设置 signed 和 unsigned
signed char c; // 范围为 -128 到 127
unsigned char c; // 范围为 0 到 255注意C 语言规定 char 类型默认是否带有正负号由当前系统决定。 这就是说 char 不等同于 signed char 它有可能是 signed char 也有可能是unsigned char 。 这一点与 int 不同 int 就是等同于 signed int 。
3. 数据类型的取值范围
上述的数据类型很多尤其数整型类型就有short、int、long、long long 四种为什么呢 其实每一种数据类型有自己的取值范围也就是存储的数值的最大值和最小值的区间有了丰富的类型我们就可以在适当的场景下去选择适合的类型。 如果要查看当前系统上不同数据类型的极限值 limits.h 文件中说明了整型类型的取值范围。 float.h 这个头文件中说明浮点型类型的取值范围。 为了代码的可移植性需要知道某种整数类型的极限值时应该尽量使用这些常量
SCHAR_MIN SCHAR_MAX signed char 的最小值和最大值。SHRT_MIN SHRT_MAX short 的最小值和最大值。INT_MIN INT_MAX int 的最小值和最大值。LONG_MIN LONG_MAX long 的最小值和最大值。LLONG_MIN LLONG_MAX long long 的最小值和最大值。UCHAR_MAX unsigned char 的最大值。USHRT_MAX unsigned short 的最大值。UINT_MAX unsigned int 的最大值。ULONG_MAX unsigned long 的最大值。ULLONG_MAX unsigned long long 的最大值
4. 变量
4.1 变量的创建
了解清楚了类型我们使用类型做什么呢类型是用来创建变量的。 什么是变量呢C语言中把经常变化的值称为变量不变的值称为常量 变量创建的语法形式是这样的
data_type name;| || |
数据类型 变量名int age; //整型变量
char ch; //字符变量
double weight; //浮点型变量变量在创建的时候就给一个初始值就叫初始化。
int age 18;
char ch w;
double weight 48.0;
unsigned int height 100;4.2 变量的分类
全局变量在大括号外部定义的变量就是全局变量 全局变量的使用范围更广整个工程中想使用都是有办法使用的。局部变量在大括号内部定义的变量就是局部变量 局部变量的使用范围是比较局限只能在自己所在的局部范围内使用的。
#include stdio.h
int global 2023;//全局变量
int main()
{int local 2018;//局部变量printf(%d\n, local);printf(%d\n, global);return 0;
}int b 100;//全局变量int main()
{{int a 10;//局部变量printf(%d\n, a); //会报错 在这里定义的a 在下面不能使用}printf(%d\n, a);return 0;
}如果局部和全局变量名字相同呢
#include stdio.h
int n 1000;
int main()
{int n 10;printf(%d\n n);//打印的结果是多少呢return 0;
}其实当局部变量和全局变量同名的时候局部变量优先使用。 全局变量和局部变量在内存中存储在哪里呢 一般我们在学习C/C语言的时候我们会关注内存中的三个区域栈区、堆区、静态区。
局部变量是放在内存的栈区全局变量是放在内存的静态区堆区是用来动态内存管理的
5. 算术操作符、-、*、/、%
在写代码时候一定会涉及到计算。 C语言中为了方便运算提供了一系列操作符其中有一组操作符叫算术操作符。 分别是 \ % 这些操作符都是双目操作符。 - * 注操作符也被叫做运算符是不同的翻译意思是一样的。
5.1 和 -
和 - 用来完成加法和减法。 和 - 都是有2个操作数的位于操作符两端的就是它们的操作数这种操作符也叫双目操作符。
#include stdio.h
int main()
{int x 4 22;int y 61 - 23;printf(%d\n, x);printf(%d\n, y);return 0;
}5.2 *
运算符 * 用来完成乘法
#include stdio.h
int main()
{int num 5;printf(%d\n, num * num); // 输出 25return 0;
}5.3 /
运算符 / 用来完成除法。 除号的两端如果是整数执行的是整数除法得到的结果也是整数。
#include stdio.h
int main()
{float x 6 / 4;int y 6 / 4;printf(%f\n, x); // 输出 1.000000printf(%d\n, y); // 输出 1return 0;
}上面示例中尽管变量 x 的类型是 float 浮点数但是 6 / 4 得到的结果是 1.0 而不是1.5 。原因就在于 C 语言里面的整数除法是整除只会返回整数部分丢弃小数部分。 如果希望得到浮点数的结果两个运算数必须至少有一个浮点数这时 C 语言就会进行浮点数除法。
#include stdio.h
int main()
{float x 6.0 / 4; // 或者写成 6 / 4.0printf(%f\n, x); // 输出 1.500000return 0;
}上面示例中 6.0 / 4表示进行浮点数除法得到的结果就是 1.5 。 再看一个例子
#include stdio.h
int main()
{int score 5;score (score / 20) * 100;return 0;
}上面的代码你可能觉得经过运算 score 会等于 25 但是实际上 score 等于 0 。这是因为score / 20 是整除会得到一个整数值 0 所以乘以 100 后得到的也是 0 。 为了得到预想的结果可以将除数 20 改成 20.0 让整除变成浮点数除法。
#include stdio.h
int main()
{int score 5;score (score / 20.0) * 100;return 0;
}也可以使用强制类型转换 如 (float)score / 20 …… 5.4 % 运算符 % 表示求模运算即返回两个整数相除的余值。这个运算符只能用于整数不能用于浮点数
#include stdio.h
int main()
{int x 6 % 4; // 2return 0;
}负数求模的规则是结果的正负号由第一个运算数的正负号决定。
#include stdio.h
int main()
{printf(%d\n, 11 % -5); // 1 正负由11决定printf(%d\n,-11 % -5); // -1 由-11 决定printf(%d\n,-11 % 5); // -1 由-11 决定return 0;
}上面示例中第一个运算数的正负号 11 或 -11 决定了结果的正负号。
6. 赋值操作符和复合赋值
在变量创建的时候给一个初始值叫初始化在变量创建好后再给一个值这叫赋值。
int a 100;//初始化
a 200;//赋值这⾥使⽤的就是赋值操作符赋值操作符 是一个随时可以给变量赋值的操作符。
6.1 连续赋值
赋值操作符也可以连续赋值如
int a 3;
int b 5;
int c 0;
c b a3;//连续赋值从右向左依次赋值的。C语言虽然支持这种连续赋值但是写出的代码不容易理解建议还是拆开来写这样方便观察代码的执行细节
int a 3;
int b 5;
int c 0;
b a3;
c b;这样写在调试的是每一次赋值的细节都是可以很方便的观察的。
6.2 复合赋值符
在写代码时我们经常可能对一个数进行自增、自减的操作如下代码
int a 10;
a a3;
a a-2;这样代码C语言给提供了更加方便的写法
int a 10;
a 3;
a - 2;C语言中提供了复合赋值符方便我们编写代码这些赋值符有 -
* / %
//下⾯的操作符后期讲解| ^7. 单目操作符、–、、-
前面介绍的操作符都是双目操作符有2个操作数的。C语言中还有一些操作符只有一个操作数被称 为单目操作符。 、–、(正)、-(负) 就是单目操作符的。
7.1 和–
是一种自增的操作符又分为前置和后置–是一种自减的操作符也分为前置–和后置–.
7.1.1 前置
int a 10;
int b a;//的操作数是a是放在a的前⾯的就是前置
printf(a%d b%d\n,a , b);计算口诀先1后使用 a原来是10先1后a变成了11再使用就是赋值给bb得到的也是11所以计算技术后a和b都 是11相当于这样的代码
int a 10;
a a1;
b a;
printf(a%d b%d\n,a , b);7.1.2 后置
int a 10;
int b a;//的操作数是a是放在a的后⾯的就是后置
printf(a%d b%d\n,a , b);计算口诀先使用后1 a原来是10先使用就是先赋值给bb得到了10然后再1然后a变成了11所以直接结束后a是 11b是10相当于这样的代码
int a 10;
int b a;
a a1;
printf(a%d b%d\n,a , b);7.1.3 前置–
如果你听懂了前置那前置–是同理的只是把加1换成了减1 计算口诀先-1后使用 int a 10;int b --a;//--的操作数是a是放在a的前⾯的就是前置--printf(a%d b%d\n,a , b);//输出的结果是9 97.1.4 后置–
同理后置–类似于后置只是把加一换成了减一 计算口诀先使用后-1
int a 10;
int b a--;//--的操作数是a是放在a的后⾯的就是后置--
printf(a%d b%d\n,a , b);//输出的结果是9 107.2 和 -
这里的是正号-是负号都是单目操作符 运算符 对正负值没有影响是一个完全可以省略的运算符但是写了也不会报错。 int a 10; 等价于 int a 10;运算符 - 用来改变一个值的正负号负数的前面加上 - 就会得到正数正数的前面加上 - 会得到负 数
int a 10;
int b -a;
int c -10;
printf(b%d c%d\n, b, c);//这⾥的b和c都是-10
int a -10;
int b -a;
printf(b%d\n, b); //这⾥的b是108. 强制类型转换
在操作符中还有一种特殊的操作符是强制类型转换语法形式很简单形式如下 (类型)int a 3.14;
//a的是int类型, 3.14是double类型两边的类型不⼀致编译器会报警告
//为了消除这个警告我们可以使用强制类型转换 int a (int)3.14;//意思是将3.14强制类型转换为int类型这种强制类型转换只取整数部分俗话说强扭的瓜不甜我们使用强制类型转换都是万不得已的时候使用如果不需要强制类型转化 就能实现代码这样自然更好的。
9. scanf和printf介绍
9.1 printf
9.1.1 基本用法
printf() 的作用是将参数文本输出到屏幕。它名字里面的 f 代表 format 格式化表示可以 定制输出文本的格式。
#include stdio.h
int main(void)
{printf(Hello World);return 0;
}上面命令会在屏幕上输出一行文字“Hello World”。 printf() 不会在行尾自动添加换行符运行结束后光标就停留在输出结束的地方不会自动换行。 为了让光标移到下一行的开头可以在输出文本的结尾添加一个换行符 \n 。
#include stdio.h
int main(void)
{printf(Hello World\n);return 0;
}如果文本内部有换行也是通过插入换行符来实现如下方代码
#include stdio.h
int main(void)
{printf(Hello\nWorld\n);printf(Hello\n);printf(World\n);return 0;
}printf在标准库的头文件 stdio.h 定义的。使用这个函数之前必须在源码文件头部引入这个头文件
9.1.2 占位符
printf() 可以在输出文本中指定占位符。 所谓 “占位符”就是这个位置可以用其他值代入。
// 输出 There are 3 apples
#include stdio.h
int main()
{printf(There are %d apples\n, 3);return 0;
}上面示例中 There are %d apples\n 是输出文本里面的 %d 就是占位符表示这个位置要用其他值来替换。占位符的第一个字符一律为百分号 % 第二个字符表示占位符的类型 %d 表示这里代入的值必须是一个整数。
printf() 的第二个参数就是替换占位符的值上面的例子是整数 3 替换 %d 。执行后的输出结果 就是 There are 3 apples 。
常用的占位符除了 %d 还有 %s 表示代入的是字符串。
#include stdio.h
int main()
{printf(%s will come tonight\n, zhangsan);return 0;
}上面示例中 %s 表示代入的是一个字符串所以 printf() 的第二个参数就必须是字符串这个例 子是 zhangsan 。执行后的输出就是 zhangsan will come tonight
输出文本里面可以使用多个占位符。
#include stdio.h
int main()
{printf(%s says it is %d oclock\n, lisi, 21);return 0;
}上面示例中输出文本 %s says it is %d o’clock 有两个占位符第一个是字符串占位符 %s 第二个是整数占位符 %d 分别对应 printf() 的第二个参数 lisi 和第三个参数 21 。 执行后的输出就是 lisi says it is 21 o’clock 。
printf()参数与占位符是一一对应关系如果有 n 个占位符 printf() 的参数就应该有 n 1 个。 如果参数个数少于对应的占位符 printf() 可能会输出内存中的任意值。
9.1.3 占位符列举
printf() 的占位符有许多种类与 C 语言的数据类型相对应。下面按照字母顺序列出常用的占位 符方便查找具体含义在后面章节介绍。
%a 十六进制浮点数字母输出为小写。%A 十六进制浮点数字母输出为大写。%c 字符。%d 十进制整数。%e 使用科学计数法的浮点数指数部分的 e 为小写。%E 使用科学计数法的浮点数指数部分的 E 为大写。%i整数基本等同于 %d 。%f 小数包含 float 类型和 double 类型。%g 6个有效数字的浮点数。整数部分一旦超过6位就会自动转为科学计数法指数部分的 e为小写(也可以用作打印有效数字如打印2个有效数字%2g%G 等同于 %g 唯一的区别是指数部分的 E 为大写。%hd 十进制 short int 类型。%ho 八进制 short int 类型。%hx 十六进制 short int 类型。%hu unsigned short int 类型。%ld 十进制 long int 类型。%lo 八进制 long int 类型。%lx 十六进制 long int 类型。%lu unsigned long int 类型。%lld 十进制 long long int 类型。%llo 八进制 long long int 类型。%llx 十六进制 long long int 类型。%llu unsigned long long int 类型。%Le 科学计数法表示的 long double 类型浮点数。%Lf long double 类型浮点数。%n 已输出的字符串数量。该占位符本身不输出只将值存储在指定变量之中。%o 八进制整数。%p 指针。%s 字符串。%u 无符号整数unsigned int。%x 十六进制整数。%zd size_t 类型。%% 输出一个百分号。
9.1.4 输出格式
printf() 可以定制占位符的输出格式
9.1.4.1 限定宽度
printf() 允许限定占位符的最小宽度。
#include stdio.h
int main()
{printf(%5d\n, 123); // 输出为 123return 0;
}上面示例中 %5d 表示这个占位符的宽度至少为5位。如果不满5位对应的值的前面会添加格。 输出的值默认是右对齐即输出内容前面会有空格如果希望改成左对齐在输出内容后面添加空 格可以在占位符的 % 的后面插入一个 - 号。
#include stdio.h
int main()
{printf(%-5d\n, 123); // 输出为 123 return 0;
}上面示例中输出内容 123 的后面添加了空格。 对于小数这个限定符会限制所有数字的最小显示宽度。
// 输出 123.450000
#include stdio.h
int main()
{printf(%12f\n, 123.45);return 0;
}上面示例中 %12f 表示输出的浮点数最少要占据12位。由于小数的默认显示精度是小数点后6位 所以 123.45 输出结果的头部会添加2个空格。
9.1.4.2 总是显示正负号
默认情况下 printf() 不对正数显示 号只对负数显示 - 号。如果想让正数也输出 号可以在占位符的 % 后面加一个 。
#include stdio.h
int main()
{printf(%d\n, 12); // 输出 12printf(%d\n, -12); // 输出 -12return 0;
}上面示例中 %d 可以确保输出的数值总是带有正负号。
9.1.4.3 限定小数位数
输出小数时有时希望限定小数的位数。举例来说希望小数点后面只保留两位占位符可以写%.2f
// 输出 Number is 0.50
#include stdio.h
int main()
{
printf(Number is %.2f\n, 0.5);
return 0;
}上面示例中如果希望小数点后面输出3位 0.500 占位符就要写成 %.3f 。 这种写法可以与限定宽度占位符结合使用。
// 输出为 0.50
#include stdio.h
int main()
{
printf(%6.2f\n, 0.5);
return 0;
}上面示例中 %6.2f 表示输出字符串最小宽度为6小数位数为2。所以输出字符串的头部有两个空格。 最小宽度和小数位数这两个限定值都可以用 * 代替通过 printf() 的参数传入
#include stdio.h
int main()
{
printf(%*.*f\n, 6, 2, 0.5);
return 0;
}
// 等同于printf(%6.2f\n, 0.5);上面示例中 %*.*f 的两个星号通过 printf() 的两个参数 6 和 2 传入。
9.1.4.4 输出部分字符串
%s 占位符用来输出字符串默认是全部输出。如果只想输出开头的部分可以用 %.[m]s 指定输出的长度其中 [m] 代表一个数字表示所要输出的长度
// 输出 hello
#include stdio.h
int main()
{
printf(%.5s\n, hello world);
return 0;
}上面示例中占位符 %.5s 表示只输出字符串“hello world”的前5个字符即“hello”。
9.2 scanf 注意在使用VS编译器的时候使用scanf会报错是因为在vs上vs认定scanf不安全需要使用scanf_s,但是scanf_s 是vs编译器特有的在其他编译器不能运行这时候我们可以使用宏定义来忽视这个情况#define _CRT_SECURE_NO_WARNINGS 1 就可以运行了对于像这种情况的解决我们可以在以后的学习再来研究 除了scanf不安全以外还有许多的函数是不安全的如strcpystrcat等等 strcpy_s strcat_s 解决每次都要宏定义的问题:我们可以在电脑上下载一个everything 用来查找文件 搜索newcfile.cpp 是因为vs在创建新的源文件的时候都是依据这个文件创建的我们可以直接在这个源文件里添加宏定义#define _CRT_SECURE_NO_WARNINGS 1 就可以保证每次运行都有这个代码了如果想添加其他一些代码也是同理 如果出现代码运行权限不够可以通过管理员运行或者把文件移到桌面上桌面上的权限是很大的 解释一下为什么会出现不安全因为scanf 接受的数据没有个数限制假如输入的数据超过了scanf所能接受的数据最大数便会出现报错而scanf_s就很好的解决了这个问题使用scanf_s在正常的接受数据后面加一个个数的限制 #include stdio.h
int main()
{int score 0;printf(请输⼊成绩:);scanf_s(%d, score, 5);printf(成绩是%d\n, score);return 0;
}如上的scanf_s,只能接受5个超过个数限制就会出现截断上面的例子只是举例 当我们有了变量我们需要给变量输入值就可以使用 scanf 函数如果需要将变量的值输出在屏幕上的时候可以使用 prinf 函数下面看一个例子
#include stdio.h
int main()
{int score 0;printf(请输⼊成绩:);scanf(%d, score);printf(成绩是%d\n, score);return 0;
}运行截图 画图演示 注标准输入一般指的就是键盘标准输出一般指的就是屏幕 那接下来我们介绍一下 scanf 函数。
9.2.1 基本用法
scanf() 函数用于读取用户的键盘输入。 程序运行到这个语句时会停下来等待用户从键盘输入。 用户输入数据、按下回车键后 scanf() 就会处理用户的输入将其存入变量。 它的原型定义在头文件 stdio.h 。 scanf() 的语法跟 printf() 类似。 scanf(%d, i);它的第一个参数是一个格式字符串里面会放置占位符与 printf() 的占位符基本一致告诉编译器如何解读用户的输入需要提取的数据是什么类型。 这是因为 C 语言的数据都是有类型的 scanf() 必须提前知道用户输入的数据类型才能处理数据。
它的其余参数就是存放用户输入的变量格式字符串里面有多少个占位符就有多少个变量。 上面示例中 scanf() 的第一个参数 %d 表示用户输入的应该是一个整数。 %d 就是一个占位 符 % 是占位符的标志 d 表示整数。第二个参数 i 表示将用户从键盘输入的整数存入变量 i。 运算符指针变量除外因为 scanf() 传递的不是值而是地址 即将变量 i 的地址指向用户输入的值。 如果这里的变量是指针变量比如字符串变量那就不用加 运算符。 下面是一次将键盘输入读入多个变量的例子。 scanf(%d%d%f%f, i, j, x, y);上面示例中格式字符串 %d%d%f%f 表示用户输入的前两个是整数后两个是浮点数比如 1 -20 3.4 -4.0e3 。这四个值依次放入 i 、 j 、 x 、 y 四个变量。 scanf() 处理数值占位符时会自动过滤空白字符包括空格、制表符、换行符等。 所以用户输入的数据之间有一个或多个空格不影响 scanf() 解读数据。另外用户使用回车键将输入分成几行也不影响解读。
1
-20
3.4
-4.0e3上面示例中用户分成四行输入得到的结果与一行输入是完全一样的。每次按下回车键以后 scanf() 就会开始解读如果第一行匹配第一个占位符那么下次按下回车键时就会从第二个占 位符开始解读。 scanf() 处理用户输入的原理是用户的输入先放入缓存等到按下回车键后按照占位符对缓存 进行解读。 解读用户输入时会从上一次解读遗留的第一个字符开始直到读完缓存或者遇到第一个不符合条 件的字符为止。
#include stdio.h
int main()
{int x;float y;// ⽤⼾输⼊ -13.45e12# 0scanf(%d, x);printf(%d\n, x);scanf(%f, y);printf(%f\n, y);return 0;
}上面示例中 scanf() 读取用户输入时 %d 占位符会忽略起首的空格从 - 处开始获取数据读取到 -13 停下来因为后面的 . 不属于整数的有效字符。这就是说占位符 %d 会读到 -13 。 第二次调用 scanf() 时就会从上一次停止解读的地方继续往下读取。这一次读取的首字符是 . 由于对应的占位符是 %f 会读取到 .45e12 这是采用科学计数法的浮点数格式。后面的 # 不属于浮点数的有效字符所以会停在这里。 由于 scanf() 可以连续处理多个占位符所以上面的例子也可以写成下面这样。
#include stdio.h
int main()
{int x;float y;
// ⽤⼾输⼊ -13.45e12# 0scanf(%d%f, x, y);return 0;
}9.2.2 scanf的返回值
scanf() 的返回值是一个整数表示成功读取的变量个数。 如果没有读取任何项或者匹配失败则返回 0 。如果在成功读取任何数据之前发生了读取错误或者遇到读取到文件结尾则返回常量 EOF。 #include stdio.hint main()
{
int a 0;
int b 0;
float f 0.0f;
int r scanf(%d %d %f, a, b, f);
printf(a%d b%d f%f\n, a, b, f);
printf(r %d\n, r);
return 0;
}输入输出测试 如果输入2个数后按 ctrlz 提前结束输入 这其实是VS中的一个bug应该输入一个ctrl z 就行了但是输入了三次才可以 在VS环境中按3次 ctrlz 才结束了输入我们可以看到r是2表示正确读取了2个数值。
9.2.3 占位符
scanf() 常用的占位符如下与 printf() 的占位符基本一致。
%c 字符。%d : 整数%f float 类型浮点数。%lf double 类型浮点数。%Lf long double 类型浮点数。%s 字符串。%[ ] 在方括号中指定一组匹配的字符比如 %[0-9] 遇到不在集合之中的字符匹配将会停止。
上面所有占位符之中除了 %c 以外都会自动忽略起首的空白字符。 %c 不忽略空白字符总是返 回当前第一个字符无论该字符是否为空格。 如果要强制跳过字符前的空白字符可以写成 scanf( %c, ch) 即 %c 前加上一个空格表 示跳过零个或多个空白字符。 面要特别说一下占位符 %s 它其实不能简单地等同于字符串。它的规则是从当前第一个非空白 字符开始读起直到遇到空白字符即空格、换行符、制表符等为止。 因为 %s 不会包含空白字符所以无法用来读取多个单词除非多个 %s 一起使用。这也意味着 scanf() 不适合读取可能包含空格的字符串比如书名或歌曲名。另外 scanf() 遇到 %s 占位 符会在字符串变量末尾存储一个空字符 \0 。 scanf() 将字符串读入字符数组时不会检测字符串是否超过了数组长度。所以储存字符串时 很可能会超过数组的边界导致预想不到的结果。为了防止这种情况使用 %s 占位符时应该指定 读入字符串的最长长度即写成 %[m]s 其中的 [m] 是一个整数表示读取字符串的最大长度后面的字符将被丢弃。
#include stdio.h
int main()
{char name[11];scanf(%10s, name);return 0;
}上面示例中 name 是一个长度为11的字符数组 scanf() 的占位符 %10s 表示最多读取用户输入 的10个字符后面的字符将被丢弃这样就不会有数组溢出的风险了。
9.2.4 赋值忽略符
有时用户的输入可能不符合预定的格式
#include stdio.h
int main()
{
int year 0;
int month 0;
int day 0;
scanf(%d-%d-%d, year, month, day);
printf(%d %d %d\n, year, month, day);
return 0;
}上面示例中如果用户输入 2020-01-01 就会正确解读出年、月、日。问题是用户可能输入其他 格式比如 2020/01/01 这种情况下 scanf() 解析数据就会失败。 为了避免这种情况 scanf() 提供了一个赋值忽略符assignment suppression character * 。 只要把 * 加在任何占位符的百分号后面该占位符就不会返回值解析后将被丢弃。
#include stdio.h
int main()
{
int year 0;
int month 0;
int day 0;
scanf(%d%*c%d%*c%d, year, month, day);
return 0;
}上面示例中 %*c 就是在占位符的百分号后面加入了赋值忽略符 * 表示这个占位符没有对应的变量解读后不必返回。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/932612.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!