C语言
C语言
持续更新中…
文章目录
- 系列文章目录
- 前言
- 一.scanf的概念
- 二.格式字符串
- 1.常用scanf格式码
- 2.scanf的返回值
- ①.scanf的返回值是函数成功转换并存储于参数中的值的个数。
- ②读入数据时遇到了“文件结束”则返回EOF(end of file 为 Ctrl + d 或 Ctrl + z)。
- ①.scanf的返回值是函数成功转换并存储于参数中的值的个数。
- 3.字符的输入
- ①输入字符
- ②输入字符串
- 4.数据宽度
- ①限制接收字符串的数量
- ②限制接收字符串的条件
- ③限制接受整型的个数
- 5.缓冲区(浅谈)
- 四.实战练习
- 五.小结
前言
本系列讲述了C语言
本系列参考书籍《C和指针》
一.scanf的概念
定义: scanf 是(scan format)的缩写。
scanf是从标准输入流stdin中读入内容的通用字程序。
scanf函数接受数个参数,其中第一个参数是一个格式字符串,用于描述期望的输入类型。
剩余几个参数都是变量,用于存储函数所读取的输入数据。
调用格式: scanf("<格式字符串>",<地址表>);
格式字符串: %[*][数据宽度][格式码]
格式码: [长度][类型格式码]
二.格式字符串 1.常用scanf格式码
补充: 格式码里的 [长度] 就是
%f
与%lf
所多出来的l
,说白了就是长的float,也就是8个字节的double。
而
%f
表示的就是 [类型格式码] 指的就是浮点型的类型,%d
与%ld
同理。
格式 | 含义 | 变量类型 |
---|---|---|
%d | 读取一个十进制整型值 | int |
%o | 读入一个八进制整型值 | int |
%x | 读入一个十六进制整型值 | int |
%u | 读入一个十进制的无符号整型 | unsigned int |
%ld | 读取一个长整型值 | long |
%f | 读取一个实型值(浮点数) | float |
%lf | 读取一个双精度实型值 | double |
%c | 读取一个字符 | char |
%s | 从输入中读取一个字符串 | char 型数组 |
%[^ ] | 从输入中读取一个字符串 | char 型数组 |
2.scanf的返回值
①.scanf的返回值是函数成功转换并存储于参数中的值的个数。
代码如下:
double a = 0;
int b = 0;
char c = 0;
printf("请输入数据:>");
int ret = scanf ("%lf%d%c", &a, &b, &c);
printf("输出结果:%d", ret);
运行结果:
请输入数据:>1.0 2c
输出结果:3
②读入数据时遇到了“文件结束”则返回EOF(end of file 为 Ctrl + d 或 Ctrl + z)。
补充: EOF == -1
代码如下:
int a = 0;
printf("请输入数据:>");
int ret = scanf ("%d", &a);
printf("输出结果:%d", ret);
运行结果:
请输入数据:>^D //请用键盘按下Ctrl + d,而非输入^D
进程已结束,退出代码0 //这里不会返回EOF而是直接停止进程
3.字符的输入
①输入字符
输入格式 : scanf("%c", &str);
我在前面使用%c
进行字符输入时与其他类型不同,我在字符 c 的前面没有空格,这也是使用%c
进行输入时与众不同的地方,它会接受输入的空格、制表符、换行符等都会被跳过,但%c
会去接收。
我们可以通过前面学习的返回值的内容进行验证。
代码如下:
char a = 0;
printf("请输入数据:>");
int ret = scanf ("%c", &a);
printf("输出结果:%d", ret);
运行结果:
请输入数据:> //此处为一个空格字符
输出结果:1
②输入字符串
输入格式 : scanf("%s", str);
在输入之前我们需要创建一个数组用于接收这一串字符char str[20] = {0};
这里的str之所以没有加取地址符&
原因在于str是一个指针,它所指向的是这一串字符中首字符的地址,对于刚开始接触C语言的同学们现在不需要对为什么str是个指针进行进一步了解,我会在后期更新关于数组与指针的相关内容。
现在你只需要知道当输入一串字符串时,你需要以这样的格式进行书写。
代码如下:
char str[20] = {0};
printf("请输入数据:>");
scanf ("%s", str);
printf("输出结果:%s", str);
运行结果:
请输入数据:>abcdef
输出结果:abcdef
4.数据宽度
①限制接收字符串的数量
输入格式 : scanf("%5s", str);
输入格式 : scanf("%5c", str);
在输入之前我们需要创建一个数组用于接收这一串字符char str[20] = {0};
在这里我们可以通过在格式码的前面加上数字%5c
或%5s
来限制接收字符的数量。
它们都需要预先创建字符类型数组,它们的区别在于%5c
可以接收空格、制表符、换行符等字符,但%5s
遇到空格、制表符、换行符等字符时会停止,即使没有接收满5个字符。
代码如下:
%5s
char str[20] = {0};
printf("请输入数据:>");
scanf ("%5s", str);
printf("输出结果:%s", str);
运行结果:
请输入数据:>abc def
输出结果:abc
代码如下:
%5c
char str[20] = {0};
printf("请输入数据:>");
scanf ("%5c", str);
printf("输出结果:%s", str);
运行结果:
请输入数据:>abc def
输出结果:abc d
②限制接收字符串的条件
输入格式 : scanf("%[^\n]", str);
在输入之前我们需要创建一个数组用于接收这一串字符char str[20] = {0};
在这里%[^\n]
表示遇到换行符\n
时停止接收字符串,当然这里的\n
也可以根据自己的需要换成其他的条件。
代码如下:
char str[20] = {0};
printf("请输入数据:>");
scanf("%[^\n]", str);
printf("输出结果:%s", str);
运行结果:
请输入数据:>abcdef/*此处换行,也就是在键盘上按下回车键*/
输出结果:abcdef
③限制接受整型的个数
这里的%2d
表示接收缓冲区内前2个整形数字,即使后面依然有数字也不再接收。
代码如下:
int a = 0;
printf("请输入数据:>");
scanf("%2d", &a);
printf("输出结果:%d", a);
运行结果:
请输入数据:>123
输出结果:12
5.缓冲区(浅谈)
缓冲区又名缓存,简单来说就是从键盘输入的数据并不会直接显示在我们的屏幕上,正如前面所说,当遇到特定条件时,它才会将内容输出。
我们输入的内容会先通过输入流stdin从键盘上输入到电脑中,那么必定要有一块空间去存储你所输入的数据,它就是缓冲区,你在键盘上输入的内容都会存入缓冲区,包括换行符\n
在某些编译器里也可以理解为回车。
缓冲区的内容会根据程序的需要进行提取,不符合条件的便跳过,最后通过输出流stdout在屏幕上显示出来。
四.实战练习
题目:在键盘上输入:a 123aa45.6 677aag\n
scanf("%c %c %o %2c %lf %2d %d %x %c", &a, &b, &c, d, &e, &f, &g, &h, &i); //相邻格式码中间没有空格,此处是为了让大家看得更清楚加上了空格
注意:遇到非该类型的值时,默认停止接收,如果遇到空格、制表符、换行符等字符时,下一个格式码会默认跳过。
请不要在对应格式码处输入错误的内容,根据编译器的处理方式的不同,产生的结果也将不确定。
变量 | 格式码 | 存储内容 |
---|---|---|
a | %c | a |
b | %c | 空格 |
c | %o | 123 |
d | %2c | aa |
e | %lf | 45.6 |
f | %2d | 67 |
g | %d | 7 |
h | %x | aa |
i | %c | g |
五.小结
scanf是C语言中十分重要的函数,它承担了大部分的输入任务,所以对scanf的清楚了解有利于未来在C语言的学习道路上更加顺畅,本篇的内容涉及的一些知识我将在后续的更新中慢慢补充,希望我的博客可以帮助到大家,文章如过出现错误或者不严谨的地方,还望大佬多多指点,我也会再接再厉写出更为优质的博客与大家相互交流。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)