东莞市seo网络推广报价,seo顾问阿亮,网页制作框架教程,网站建设要注意哪些文章目录 0 前言1 函数原型2 参数2.1 格式字符串2.1.1 转换说明 2.2 参数列表 3 返回值4 读取机制4.1 基本概念4.2 转换说明4.3 读取过程4.4 读取示例4.5 多参数 6 示例6.1 示例16.2 示例26.3 示例36.4 示例4 0 前言
scanf()函数虽然使用起来较为灵活#xff0c;但是其读取机… 文章目录 0 前言1 函数原型2 参数2.1 格式字符串2.1.1 转换说明 2.2 参数列表 3 返回值4 读取机制4.1 基本概念4.2 转换说明4.3 读取过程4.4 读取示例4.5 多参数 6 示例6.1 示例16.2 示例26.3 示例36.4 示例4 0 前言
scanf()函数虽然使用起来较为灵活但是其读取机制还是有点复杂。
1 函数原型
scanf()从标准输入流stdin读取格式化输入函数原型如下
int scanf(const char *format, ...);2 参数
scanf()函数的参数分为两类
format 格式字符串… 参数列表。
2.1 格式字符串
在scanf()函数中
格式字符串是必不可少的格式字符串由字面文本量、转义序列和转换说明三部分组成。
2.1.1 转换说明
格式字符串中的转换说明和参数列表在数量、顺序和类型上要完全匹配格式字符串中只包含转换说明即可强烈建议不要包括字符串字面量和转义序列但多个转换说明之间可以用空格隔开便于阅读如果想从键盘获取字符建议用getchar()函数替代%c如果想从键盘获取字符串建议用gets()函数替代%s%s会读取的字符串末尾加上空字符’\0’作为字符串结束符与printf()函数不同在scanf()函数中%f对应float类型变量%lf对应double类型变量。
2.2 参数列表
在scanf()函数中
参数列表是必不可少的参数列表中参数的数量是可变的但至少应包含一个参数参数列表中参数的类型是指针类型变量名。
3 返回值
scanf()函数的返回值类型为int型
读取成功返回成功读取的项数读取失败返回EOF。
C语言标准描述如下
1. Both scanf and wscanf return the number of fields successfully converted and assigned; the return value does not include fields that were read but not assigned. A return value of 0 indicates that no fields were assigned.
2. The return value is EOF for an error or if the end-of-file character or the end-of-string character is encountered in the first attempt to read a character.4 读取机制
4.1 基本概念
键盘输入从键盘输入的都是文本因为键盘只能生成文本字符字母、数字和标点符号空白字符空格、制表符和换行符。
4.2 转换说明
转换说明不同有效字符也不同
%d转换说明要求scanf()函数能识别十进制数0-9和正负号±%x转换说明要求scanf()函数能识别十六进制数a-f和A-F%f转换说明要求scanf()函数能识别小数点、e计数法和p计数法等%s转换说明要求scanf()函数能识别除空白字符外的所有字符。
4.3 读取过程
scanf()函数读取标准输入流stdin过程如下
在遇到第一个非空白字符前所有的空白字符被读出且被丢弃从遇到第一个非空白字符始直至 1遇到无效字符在遇到的第一个无效字符处停止读取并将无效字符退回至标准输入流stdin中 2遇到空白字符在遇到的第一个空白字符处停止读取并将空白字符退回至标准输入流stdin中 3达到指定字段宽度如果使用字段宽度修饰符在有效字符数达到指定字段宽度处停止读取读取结束后对已读取的有效字符按照转换说明进行转换然后储存在指定变量中。
特别说明使用scanf()函数之后一定要清空标准输入流stdin。
4.4 读取示例
以scanf(“%d”, num)为例
scanf()函数从标准输入流stdin中读取字符跳过前面所有的空白字符从第一个非空白字符开始直至 1遇到无效字符将无效字符退回至标准输入流stdin中读取结束 2遇到空白字符将空白字符退回至标准输入流stdin中读取结束 3达到指定字段宽度读取结束将已读取的有效字符按照转换说明要求进行转换并储存在指定的变量num中
问题如果第一次读到的非空白字符是无效字符如字母a会发生什么情况呢
解答如上所述如果读到字母a则立即停止读取并将字母a退回stdin中那么本次读取就未读到任何有效的字符也就是说本次读取是失败的不会有任何值储存在变量num中scanf()函数的返回值为0。
4.5 多参数
参数列表中的多个参数对应格式字符串中的多个转换说明
用空白字符将键盘输入分成多个字段字段间可以有多个空白字符多个空白字符集中在一行或分散在多行多个字段与多个转换说明唯一例外的是%c转换说明根据%cscanf()函数会读取每个字符包括空白字符。
6 示例
6.1 示例1
scanf()函数读取过程中的丢弃和回退代码如下所示
int main ()
{//定义变量int a;char str[80] {0};//给变量a赋值输入2个空格12a2个空格Enterscanf(%d, a);//打印变量a的值printf(a%d\n, a);//用gets清空stdingets(str);//打印str的内容和长度printf(str %s, len %d\n, str, strlen(str));return 0;
}代码执行结果如下图所示 代码及运行结果分析 第一阶段
标准输入流中有字符2个空格字符12a2个空格回车符共8个字符scanf()函数读取前两个空格并丢弃scanf()函数读取字符1和2转换为数值12后储存在变量a中scanf()函数读取字符a发现a是无效字符将a回退至标准输入流stdin中至此scanf()函数从标准输入流stdin中读取完毕
第二阶段 6. gets()函数继续从标准输入流stdin中读取字符串 7. 因标准输入流stdin中仍残留有scanf()函数未读完的字符故无需用户再次从键盘键入字符 8. gets()函数会读空标准输入流stdin中的所有字符直至遇到回车符’\n’
第三阶段 9. printf()函数打印a和str的内容并统计str的长度a12符合预期str长度为3符合预期即字符’a’2个空格。
6.2 示例2
scanf()函数返回值代码如下所示
void clear_stdin(void)
{while (getchar() ! \n);
}int main()
{//变量定义int a 0, b 0, c 0;int num 0;//第1次输入puts(输入11 22 33 : );num scanf(%d%d%d, a, b, c);clear_stdin();printf(a%d, b%d, c%d, num%d\n\n, a, b, c, num);//第2次输入puts(输入44 55 a6 : );num scanf(%d%d%d, a, b, c);clear_stdin();printf(a%d, b%d, c%d, num%d\n\n, a, b, c, num);//第3次输入puts(输入77 a8 99 : );num scanf(%d%d%d, a, b, c);clear_stdin();printf(a%d, b%d, c%d, num%d\n\n, a, b, c, num);//第4次输入puts(输入a0 11 22 : );num scanf(%d%d%d, a, b, c);clear_stdin();printf(a%d, b%d, c%d, num%d\n\n, a, b, c, num);return 0;
}代码执行结果如下图所示 代码及运行结果分析
scanf()函数在%d转换说明下希望从标准输入流stdin中读取数字字符0-9和正负符号(±)当读取到非数字字符’a’时将’a’退回至标准输入流stdin中并停止读取理论分析和num的实际打印结果相符合。
6.3 示例3
scanf()函数读取字符%c代码如下所示
void clear_stdin(void)
{while (getchar() ! \n);
}int main()
{//变量定义char c1 0, c2 0, c3 0;//第1次输入puts(输入字符abc中间不加空格 : );scanf(%c%c%c, c1, c2, c3);clear_stdin();printf(c1%c, c2%c, c3%c\n\n, c1, c2, c3);//第2次输入puts(输入字符a b c中间加空格 : );scanf(%c%c%c, c1, c2, c3);clear_stdin();printf(c1%c, c2%c, c3%c\n, c1, c2, c3);return 0;
}代码执行结果如下图所示 代码及运行结果分析
scanf()函数在%c转换说明下会读取键盘键入的每一个字符包括空白字符。
6.4 示例4
scanf()函数读取字符串%s代码如下所示
void clear_stdin(void)
{while (getchar() ! \n);
}int main()
{//变量定义char str[80] { 0 };//puts(输入hello world);scanf(%s, str);clear_stdin();puts(str);return 0;
}代码执行结果如下图所示 代码及运行结果分析
scanf()函数在读取字符的时候如果遇到空白字符则停止读取所以%s只能读取单词不能读取句子。