前言:

       由于对C语言的理解不够深刻,且距离上次学习C语言的时间过于“久远”,所以本人准备重新开始学习C语言。

        那么刚好借这个机会,既向大家分享我的学习笔记,同时又能监督我自己去努力学习这门语言,为将来从事嵌入式行业打下基础!!

学习C语言是很漫长的,要重新整理一遍学习的内容更是反复且枯燥的。但不积跬步,无以至千里,没有什么事情是一蹴而就的,我们要学会沉下心来,一起努力,一起期待未来!!

        今天的笔记主要是围绕认识与运用输入函数:认识输入函数scanf的结构,函数scanf的转换规范,使用函数scanf注意事项,函数scanf的运用。

目录

输入函数scanf

输入函数scanf的格式

函数scanf的转换规范

按照字符串形式输入

按照转换类型与数量输入

判断不同类型是否加&

使用函数scanf注意事项

避免输出与转换类型不匹配

避免输入大于转换类型取值范围

避免后置参数取值范围小于转换结果

函数scanf的运用

输入函数scanf

输入函数scanf的格式

       scanf函数的一般格式为:scanf(“格式化字符串”,需要输入的变量)

函数原型:

#include <stdio.h>

int scanf(const char *format, ...);

format 参数:
format 参数是一个格式化字符串,由格式化占位符和普通字符组成。
格式化占位符(以 % 开头)用于指明输出的参数值如何格式化。

... 附加参数:
附加参数的个数由格式化字符串决定。
每个参数均为一个存储空间,并与面格式化字符串中占位符的类型和位置一一对应。
如果是一个普通的变量名,应在其变量名前边加上 & 符号。

函数scanf的转换规范

按照字符串形式输入

        当我们使用输入函数scanf在对不同数据类型进行输入时,需要按照第一个字符串的形式进行输入,否则字符串找不到第一个参数进行匹配,找不到需要转换的部分,也就无法得到正确结果:

当字符串中格式占位符用空格隔开时,输入时需要加入空格进行分割

#include "stdio.h"

char c;
short hd;
int d;
long ld;
long long lld;

void main()
{
	scanf("%c %hd %d %ld %lld", &c, &hd, &d, &ld, &lld);
	printf("%c %hd %d %ld %lld", c, hd, d, ld, lld);
}

当字符串中格式占位符用逗号隔开时,输入时需要加入逗号进行分割

一般不建议这么分割,逗号分半角和全角,这会加大程序结果运行错误的可能。

#define _CRT_SECURE_NO_WARNINGS  1
#pragma warning(disable:6031)
#include "stdio.h"

char c;
short hd;
int d;
long ld;
long long lld;

void main()
{
	printf("输入的值 ");
	scanf("%c,%hd,%d,%ld,%lld", &c, &hd, &d, &ld, &lld);
	printf("返回的值 ");
	printf("%c %hd %d %ld %lld", c, hd, d, ld, lld);
}

按照转换类型与数量输入

        当我们使用输入函数scanf在对不同数据类型进行输入时,需要注意前后的对应关系,不仅是转换类型的写法,其数量也需要与后续的参数类型和数量一一对应。

char c;
short hd;
int d;
long ld;
long long lld;

scanf("%c %hd %d %ld %lld", &c, &hd, &d, &ld, &lld);
printf("%c %hd %d %ld %lld", c, hd, d, ld, lld);

 在示例代码中,%c对应字符型c、%hd对应短整型hd、%d对应整型d、%ld对应长整型ld、%lld对应加长整型lld。

判断不同类型是否加&

        当我们使用输入函数scanf在对不同数据类型进行输入时,函数scanf首先会将输入的字符串按照对应的转换类型进行转换,转换完成后的二进制,将依次存放到后续参数所输入的变量地址当中。

        变量:函数scanf将转换后的二进制存储到基本变量当中,直接在变量名前加&。

        字符数组:函数scanf将字符串逐一存储到字符数组中,就不用加&。

#include "stdio.h"

char c;
char str[8];

void main()
{
	printf("输入的值 ");
	scanf("%c %s", &c, str);
	printf("返回的值 ");
	printf("%c %s\n", c, str);
}

使用函数scanf注意事项

避免输出与转换类型不匹配

#include "stdio.h"

float f;

void main()
{
	printf("输入的值 ");
	scanf("%f", &f);
	printf("返回的值 ");
	printf("%lld\n", f);
	printf("返回的值 ");
	printf("%f\n", f);
}

在示例代码中,该字符串与格式占位符%f进行匹配,将转换后的值保持在变量f中,使用不匹配的格式占位符%lld输出格式输出了错误的值,使用匹配的格式占位符%f输出格式输出了正确的值。

避免输入大于转换类型取值范围

#include "stdio.h"

char c;

void main()
{
	printf("输入的值 ");
	scanf("%c", &c);
	printf("返回的值 ");
	printf("%d\n", c);
}

在示例代码中,该字符串与格式占位符%c进行匹配,将转换后的值保持在变量c中,然后我们输入了超出%c转换类型的取值范围(-127~128)的300时,就输出了错误的值。

避免后置参数取值范围小于转换结果

#include "stdio.h"

short hd;

void main()
{
	printf("输入的值 ");
	scanf("%d", &hd);
	printf("返回的值 ");
	printf("%d\n", hd);
}

在示例代码中,该字符串与格式占位符%d进行匹配,将转换后的值保持在变量hd中,然后我们输入了超出了后置参数short的取值范围(-32767~32768)的65535时,就输出了错误的值。

函数scanf的运用

        当我们了解了输入函数scanf的基本原理,以及其函数的转换规范和使用的注意事项,就可以运用该函数完成以下功能:

输入两个字符对比,输出对应ASCII码表序号,并判断是否互为大小写字母

#include "stdio.h"

char a;
char b;

void main()
{
	printf("请输入第一个字母 ");
	scanf("%c",&a);
	printf("字母 %c 对应ASCII码表序号为%d\n",a,a);
	printf("请输入第二个字母 ");
	scanf("%c", &b);
	printf("字母 %c 对应ASCII码表序号为%d\n", b, b);
}

 在示例代码中,当我们输入第一个字母后,能正确输出第一个字母的ASCII码表序号。然而想继续输入第二个字母时,却自动的弹出没有经过操作的字母。

原因:编译器会自动认为回车字符作为你第二个字母,而在ASCII码表中值为10的字符正是回车字符\n。

解决方法:我们可以利用getchar()函数,函数的功能是读取一个字符。当缓冲区中没有字符可以读取时,getchar()会等待我们输入一个字符,然后在缓冲区中进行读取。

修改后的代码就可以进行正常输入

#include "stdio.h"

char a;
char b;

void main()
{
	printf("请输入第一个字母 ");
	scanf("%c",&a);
	printf("字母 %c 对应ASCII码表序号为%d\n",a,a);
    getchar();
	printf("请输入第二个字母 ");
	scanf("%c", &b);
	printf("字母 %c 对应ASCII码表序号为%d\n", b, b);
}

​

再加入简单的if判断语句

#include "stdio.h"
char a;
char b;

void main()
{
	printf("请输入第一个字母 ");
	scanf("%c",&a);
	printf("字母 %c 对应ASCII码表序号为%d\n",a,a);
	getchar();
	printf("请输入第二个字母 ");
	scanf("%c", &b);
	printf("字母 %c 对应ASCII码表序号为%d\n", b, b);

	if (a >= 97 && a <= 122)
	{
		if(b == a - 32)
		printf("第二个字母 %c 为第一个字母 %c 的大写字母\n", b, a);
		else if (b == a)
		printf("第二个字母 %c 与第一个字母 %c 相同且都为小写字母\n", b, a);
		else printf("第二个字母 %c 不为第一个字母 %c 的大写字母\n", b, a);
	}
	else if (a >= 65 && a <= 90)
	{
		if (b == a + 32)
		printf("第二个字母 %c 为第一个字母 %c 的小写字母\n", b, a);
		else if (b == a)
		printf("第二个字母 %c 与第一个字母 %c 相同且都为大写字母\n", b, a);
		else printf("第二个字母 %c 不为第一个字母 %c 的小写字母\n", b, a);
	}
}

 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐