c语言学习-2

本文详细介绍了C语言中的数据类型,包括常量、变量、进制转换、浮点型与字符型的使用。此外,还深入探讨了scan的使用原理、混合运算的规则以及如何利用scanf读取标准输入缓冲区。通过实例展示了如何判断闰年、循环读取输入以及混合输入不同类型的数据。最后,文章还涵盖了printf的使用,包括控制输出格式的方法。
摘要由CSDN通过智能技术生成

一、数据类型与运算符

1.常量与变量

#include<stdio.h>  //引用文件

#define PI 3  //PI就是符号常量
int main() 
{
	int a = 3;//a就是一个变量
	a = 5;
	//PI = 10;//符号常量不可以赋值
	printf("%d\n", PI);
	return 0;
}
3

D:\cbook\数据类型与运算符\Debug\1.常量与变量.exe (进程 708)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

2.scan的使用

#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>

int main()
{
	int a,b;
	scanf("%d%d", &a,&b);//一定要在变量前加入&符号
	printf("a=%d,b=%d\n", a,b);
	printf("a+b=%d\n", a+b);
	return 0;
}
11 13
a=11,b=13
a+b=24

D:\cbook\数据类型与运算符\Debug\2.scan的使用.exe (进程 18264)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

3.进制变换

#define _CRT_SECURE_NO_WARNINGS //解决scanf报错问题
#include<stdio.h>

/*
观察内存使用的十六进制
123    十进制

111    1011    二进制

7B     十六进制

173    八进制

00 00 00 7b 英特尔x86架构是小端存储(英特尔还是AMD),低位在前,高位在后

为什么内存数据要用十六进制去看,就是非常高效,两个字符就可以表示一个字节

1位  1bit 存储0或者1
1字节 1 byte =  8bit
1Kb = 1024 字节
1Mb = 1024 Kb
1Gb = 1024 Mb

磁盘1G=1000 000 000 字节

64位cpu

32位

0x00 7D FD 04 地址是4个字节

2 的 32 次方,是 1024 * 1024 * 1024 * 4 = 4G
*/
int main()
{
	//int i,变量i是4个字节,32位
	int i = 123;//十进制
	int a = 0x7b;//十六进制
	int b = 0173;//八进制
	printf("a=%d\n", a);//%d以十进制方式去输出某一个整型数
	printf("b=%d\n", b);
	printf("i=%d\n", i);
	return 0;
}
a=123
b=123
i=123

D:\cbook\数据类型与运算符\Debug\3.进制变换.exe (进程 1736)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

4.浮点型与字符型

#include<stdio.h>

int main()
{
	//通过float f来定义浮点变量,f占用4个字节的空间
	float f = 1.234;
	float a = 3e-3;//e代表10的幂次
	float b = 3e3;
	printf("输出的浮点数 f=%f\n", f);//%f就是以浮点形式输出对应数据
	printf("输出的浮点数 a=%f\n", a);
	printf("输出的浮点数 b=%f\n", b);


	char c = 'a';//定义一个字符型变量,并赋值为 'a',一个字符变量占用1个字节大小的空间
	printf("c=%c\n", c);
	printf("c=%c\n", 97);
	return 0;
}
输出的浮点数 f=1.234000
输出的浮点数 a=0.003000
输出的浮点数 b=3000.000000
c=a
c=a

D:\cbook\数据类型与运算符\Debug\4.浮点型与字符型.exe (进程 14388)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

5.字符型大小写转换

#include<stdio.h>

/*
 'a'是字符型常量
 “a”是字符串常量,如“hello word”
*/
int main()
{
	char c = 'a';//现在是小写字母a,要变成大写字母A
	c = c - 32;
	printf("c = %c\n", c);//以字符形式来输出c
	return 0;
}
c = A

D:\cbook\数据类型与运算符\Debug\5.字符型大小写转换.exe (进程 14952)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

6.混合运算

#include<stdio.h>
#include<stdlib.h>

//混合运算,从长字节到短字节数据需要强制类型转换
int main()
{
	int i = 5;
	float f, g;
	short m;
	long l = 5;
	f = i / 2;//因为没有强制类型转换i/2表达式为整型运算
	g = (float)i / 2;
	m = (short)l + 2;//不加short强制编译会警告
	printf("i=%d\nf=%f\ng=%f\nm=%d\n", i, f, g, m);
	return 0;
}
i=5
f=2.000000
g=2.500000
m=7

D:\cbook\数据类型与运算符\Debug\6.混合运算.exe (进程 9092)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
#include<stdio.h>

//混合运算,从长字节到短字节数据需要强制类型转换
int main()
{
	int i = 5;
	float j = i / 2;//输出的j是2还是2.5,答案是2
	float k = (float)i / 2;//k输出是2.5,强制类型转换
	printf("i=%d\nj=%f\nk=%f\n", i, j, k);
	return 0;
}
i=5
j=2.000000
k=2.500000

D:\cbook\数据类型与运算符\Debug\6.1混合运算.exe (进程 13200)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

7.scanf读取标准输入缓冲区的原理

#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>

/*
scanf读取的是标准输入
printf输出到黑窗口(控制台),输出到了标准输出

scanf使用方法
	#include<stdio.h>
	int scanf( const char * format, ... );

format 是一个字符串, ...是可变参数,参数的数目和format中的%的数目保持一致
%d  一个十进制数
%f  一个浮点数
%c  一个单一的字符

%d ,%f ,%c 不限制出现次数
"%d%d%d",&a,&b,&c
*/

int main()
{
	int i;
	scanf("%d", &i);
	printf("i=%d\n", i);
	return 0;
}
11
i=11

D:\cbook\数据类型与运算符\Debug\7.scanf读取标准输入缓冲区的原理.exe (进程 10532)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>

int main()
{
	int i;
	char c;
	scanf("%d", &i);
	printf("i=%d\n", i);
	scanf("%c", &c);
	printf("c=%c\n", c);
	return 0;
}
10
i=10
c=


D:\cbook\数据类型与运算符\Debug\7.scanf读取标准输入缓冲区的原理.exe (进程 11744)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

缓冲区为空的时候,scanf才会卡住(阻塞)

行缓冲:在这种情况下,当在输入和输出中遇到换行符时,将执行真正的I/O操作。
这时,我们输人的字符先存放到缓冲区中,等按下回车键换行时才进行实际的IO操作。
典型代表是标准输入缓冲区(stdin)和标准输出缓冲区(stdout) .

如图所示,我们向标准输入缓冲区中放入的字符为'10\n',输入'\n’(回车)后,scanf 函数才开始匹配, 
scanf函数中的%d匹配整型数10,然后放入变量i中,接着进行打印输出,这时'\n'仍然在标准输入缓冲区(stdin)内,
如果第二个scanf函数为scanf("%d",&i),那么依然会发生阻塞,因为 scanf函数在读取整型数、浮点数、字符串
(后面介绍数组时讲解字符串)时,会忽略'n'(回车符)、空格符等字符
(忽略是指scanf函数执行时会首先删除这些字符,然后再阻塞) 。
scanf函数匹配一个字符时,会在缓冲区删除对应的字符。
因为在执行scanf("%c",&c)语句时,不会忽略任何字符,所以scanf("%c",&c)读取了还在缓冲区中残留的'n'

在这里插入图片描述
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>

int main()
{
	int i,j;
	float f;
	scanf("%d", &i);
	printf("i=%d\n", i);

	scanf("%f", &f);
	printf("f=%f\n", f);

	scanf("%d", &j);
	printf("j=%d\n", j);
	return 0;
}

在这里插入图片描述

8.scanf读取两个整型数

#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>

/*
%d和%f都是忽略空格
*/
int main()
{
	int a, b;
	scanf("%d%d", &a, &b);
	printf("a+b=%d\n", a + b);
	return 0;
}
12 45
a+b=57

D:\cbook\数据类型与运算符\Debug\8.scanf读取两个整型数.exe (进程 3524)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

9.判断闰年

#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>

int main()
{
	int year;
	scanf("%d", &year);
	if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0) 
	{
		printf("yes\n");
		printf("%d是闰年\n", year);
	}
	else {
		printf("no\n");
		printf("%d不是是闰年\n", year);
	}
	return 0;
}
2000
yes
2000是闰年

D:\cbook\数据类型与运算符\Debug\9.判断闰年.exe (进程 18460)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

10.scanf函数的循环读取

#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>

/*
scanf()读取配置format(格式)字符串的输入.当读取到一个控制字符,它把值的置到下一个变量,
空白(tabs,空格等等)会跳过.非空白字符和输入匹配,然后丢弃,如果是一个在%符号和控制间的数量,
那么只有指定数量的字符转换到变量中,如果scanf()遇到一个字符集(用%[]控制字符表示),
那么在括号中的任意字符都会读取到变量中,scanf()的返回值是成功赋值的变量数量,发生错误时返回EOF.


scanf 循环读取发生错误时返回EOF

直接输入EOF,按着ctrl,鼠标左键点击,原来EOF就是-1

Windows什么情况下scanf会出错?
	行首输入ctrl z,回车
	行首输入ctrl z,回车
	行首输入ctrl z,回车
	3次
*/
// 清空标准输入缓冲区,VS2012 fflush(stdin) 
//stdin是标准输入
//VS2013-VS2019清空标准输入缓冲区,用rewind
int main()
{
	int i;
	int ret;//用来获取scanf的返回值
	while (rewind(stdin), (ret = scanf("%d", &i)) != EOF)
	{
		printf("i=%d\n", i);
		printf("ret=%d\n", ret);
	}
	return 0;
}
10
i=10
ret=1
15
i=15
ret=1
a
i=15
ret=0
b
i=15
ret=0
200
i=200
ret=1

D:\cbook\数据类型与运算符\Debug\10.scanf函数的循环读取.exe (进程 18664)已退出,代码为 -1。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

在这里插入图片描述
加上rewind(stdin),清空缓冲区就不会疯狂打印
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

11.scanf读取字符串打印

#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>

//一行的内容要进行循环读取时,不要使用fflush
//读取字符串并打印对应字符串的大写字母
int main()
{
	char c;
	while (scanf("%c", &c) != EOF) {//读取字符串
		if (c != '\n') 
		{
			printf("%c", c - 32);
		}
		else {
			printf("\n");
		}
	}
	return 0;
}
helloworld
HELLOWORLD
^Z
^Z

D:\cbook\数据类型与运算符\Debug\11.scanf读取字符串打印.exe (进程 9320)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

12.多种数据类型混合输入

#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>
#include<stdlib.h>

//一个scanf读多种类型的数据
// 混合输入时每次在%c之前需要加入一个空格
//整型,字符,浮点型混合输入
int main()
{
	int i = 5;
	double f;
	float l;
	char c;
	int ret;
	ret = scanf("%d %c%lf%f", &i, &c, &f, &l);
	printf("i=%d\nc=%c\nf=%lf\nl=%f\nret=%d\n",i,c,f,l,ret);
	return 0;
}

15 a12.3 2.5
i=15
c=a
f=12.300000
l=2.500000
ret=4

D:\cbook\数据类型与运算符\Debug\12.多种数据类型混合输入.exe (进程 16712)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
15 a 5.6 12.3
i=15
c=a
f=5.600000
l=12.300000
ret=4

D:\cbook\数据类型与运算符\Debug\12.多种数据类型混合输入.exe (进程 16032)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

13.printf的使用

#include<stdio.h>

//printf控制输出格式
int main()
{
	int i = 10;
	float f = 99.5;

	printf("score=%f\n", f);
	printf("name=%s,age=%d,sex=%c,score=%4.1f\n", "Admin", 34, 'a', f);
	printf("score=%5.2f\n", f);
	printf("\n");
	printf("student number = %3d\n", i);
	printf("student number = %-3d\n", i);
	printf("%10s\n", "hello");
	return 0;
}
score=99.500000
name=Admin,age=34,sex=a,score=99.5
score=99.50

student number =  10
student number = 10
     hello

D:\cbook\数据类型与运算符\Debug\13.printf的使用.exe (进程 5520)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

良辰美景好时光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值