C语言scanf_s函数介绍,编程题练习

C语言scanf_s函数介绍,编程题练习 文章目录一scanf_s()函数1, scanf_s() 到底做了什么2和scanf的关系3常见误区二编程题练习一scanf_s()函数scanf_s() 是一个“按格式从标准输入读取数据并存入指定变量”的函数1, scanf_s() 到底做了什么intnscanf_s(%d,n);这行代码做了三件事1从标准输入通常是键盘读取数据。2按%d 指定的格式解析把读到的字符转成整数。3把结果存入n 指向的内存也就是变量 n。 按格式读取输入解析成指定类型再写入对应变量的地址。2和scanf的关系scanf_s() 是 scanf() 的安全版本由微软提出主要区别是对 %c、%s 这类可能溢出的格式必须额外传一个缓冲区大小参数。目的是防止缓冲区溢出。scanf scanf_s%dscanf(%d,n);scanf_s(%d,n);%cscanf(%c,c);scanf_s(%c,c,1);%sscanf(%s,str);scanf_s(%s,str,100);可移植性 标准 C跨平台 MSVC 特有GCC/Clang 不支持 功能上scanf_s 和 scanf 都是“按格式读输入”只是 scanf_s 多了安全检查。3常见误区1. 它不是“只能读键盘scanf_s 读的是标准输入stdin默认连到键盘。但如果你重定向了输入programinput.txt#它就会从文件读而不是键盘。#所以准确说它读的是 stdin不一定是键盘。2. 它不只是输入还要解析 scanf_s(%d,n);//如果你输入 abc%d 解析失败scanf_s 不会把 abc 存进 n而是返回失败。//它不是简单地把键盘字符搬进程序而是按格式转换。3. 它需要变量的地址scanf_s(%d,n);// 正确传 nscanf_s(%d,n);// 错误n 是值不是地址scanf_s 要把结果写回变量所以必须知道变量在哪必须传地址。这也是为什么 %s 可以直接写数组名 str因为数组名本身就是地址返回值表示成功读到了几项intretscanf_s(%d,n);//ret 1成功读到一个整数。//ret 0输入不匹配没读到。//ret EOF输入结束或出错。//很多人忽略返回值导致输入失败时程序行为异常。//在 stdio.h 里EOF 是一个宏通常定义成#defineEOF(-1)二编程题练习4#includestdio.h#includectype.hintmain(){intn0;scanf_s(%d,n);inta0,b0,c0,d0,e0;for(inti0;in;i){charmgetchar();if(islower(m)){a;}elseif(isupper(m)){b;}elseif(isdigit(m)){c;}elseif(isblank(m)){d;}else{e;}}printf(小写字母的个数是%d\n大写字母的个数是%d\n数字的个数是%d\n空格的个数是%d\n其他字符的个数是%d\n,a,b,c,d,e);return0;}5#includestdio.hintSn_func(intn,inta){inti0;intnum0;intresult0;for(i0;in;i){resultresult*10a;numresult;}returnnum;}intmain(){intn5,a2;intresultSn_func(n,a);printf(%d\n,result);return0;}8#includestdio.hintfunc(){for(intmin100;min1000;min){intamin;intresult0;for(inti0;i3;i){intba%10;a/10;result(b*b*b);}if(resultmin){printf(%d ,min);}}return0;}intmain(){intresultfunc();return0;}9#includestdio.hintfunc(intn){for(inti1;in;i){intnum0,flag0;for(intji;j1;--j){if(i%j0){numi/j;}}if(numi){printf(%d its factors are ,i);for(intji;j1;--j){if(i%j0){if(ji){printf(%d,i/j);}else{printf(, %d,i/j);}}}printf(\n);}}return0;}intmain(){intn1000;intresultfunc(n);return0;}