printf和scanf的介绍以及VS解决scanf报错问题

前言

本章内容我们将上章没介绍完的printf和scanf进行讲解,由于VS中scanf不能正常使用,把printf和scanf和VS的scanf问题放在一起讲解,可以更好的帮助初学者解决问题,当然本章我们主要以解决VS中scanf报错问题。

一、printf和scanf的介绍和占位符

1.占位符

1.1printf中的占位符介绍

printf可以在输出文本中指定占位符,所谓“占位符”,就是这个位置可以用其他值代入。

#include <stdio.h>
int main()
{
int n = 0;
printf("there are %d apples\n",n);//%d是一种占位符,表示的10进制有符号的整型。%s —— 字符串
return 0;
}

占位符的第一个字符一律有百分号%,1个文件中可以有多个占位符。
如:

#include <stdio.h>
int main()
{
printf("%s says it is %d O'clock\n","wangwu",20);
return 0;
}

printf()参数与占位符是一 一对应关系,如果有n个占位符,printf()的参数应该有n+1个。
占位符举例:
%a:十六进制浮点数,字母输出为小写。
%A:十六进制浮点数,字母输出为大写。
%c:打印字符。
%d:十进制整数。
%e:使用科学计数法的浮点数,指数部分的e为小写。
%E:是用科学计数法的浮点数,指数部分的E为大写。
%i:整数,基本等同于%d。
%f:小数(包含float、double),float —— %f,double —— %lf。
%g:6个有效数的浮点数。整数部分一旦超过6位,就会自动转为科学计数法,指数部分的e为小写。
%G:等同于%g,唯一区别是指数部分的E为大写。
%hd:十进制short int类型。
%ho:八进制short int类型。
%hx:十六进制short int类型。
%hu:unsigned short int类型。
%ld:十进制long int类型。
%lo:八进制long int类型。
%lx:十六进制long int类型。
%lu:unsinged long int类型。
%lld:十进制long long int类型。
%llo:八进制long long int类型。
%llx:十六进制long long int类型。
%llu:unsigned long long int类型。
%Le:科学计数法表示的long double类浮点数。
%Lf:long double类浮点数。
%n:已输出的字符数量。该占位符本身不输出,只将值存储在指定变量之中。
%o:八进制整数。
%p:指针(用来打印地址)。
%s:字符串。
%u:无符号整数(unsigned int)。
%x:十六进制整数。
%zd:size_t类型。
%%:输出一个百分号。
size_t是sizeof()的返回类型,size_t是无符号的整型类型。

1.2scanf中占位符的介绍

scanf和printf的占位符基本一样。
下列举出几个scanf中特例占位符:
%[ ]:在方括号中指定一组匹配的字符(比如:%[0-9]),遇到不在集合之中的字符,匹配将会停止。
上面所有占位符之中,除了%c以外,都会自动忽略起首的空白字符。%c不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格。如果要强制跳过字符前的空白字符,可以写成:

scanf(" %c",&ch);//即%c前加一个空格,表示跳过零个或多个空白字符。

占位符%s,它其实不能简单地等同于字符串。它的规则是,从当前第一个非空白字符开始读起,直到遇到空白字符(即空格,换行符,制表符等)为止。
例:

#include <stdio.h>
int main()
{
char arr[20] = {0};
scanf("%s",arr);//这里没有写&arr,为什么呢?因为数组名arr就是地址。
return 0;
}

%s不会包含空白字符,无法读取多个字符,除非多个%s一起使用。scanf()遇到%s占位符,会在字符串变量末尾存储一个空字符\0。
scanf()将字符串读入字符数组时,不会检测字符串是否超过了数组长度。所以,储存字符串时,很有可能会超过数组的边界,导致预想不到的结果。为防止这种情况,使%s占位符时,应该指定读入字符串的最长长度,即写成%[m]s,其中的[m]是一个整数,表示读取字符串的最大长度,后面的字符将被丢弃。

2.printf的介绍

printf: print —— 打印, f——format 格式
基本用法:按照指定格式打印数据,使用该函数要包含头文件<stdio.h>。
输出格式:printf()可以定制占位符的输出格式。
①限制宽度:

#include <stdio.h>
int main()
{
printf("%d\n",123);
printf("%5d\n",123);//这里的%5d指的是最小长度为5位,并且默认右对齐。
printf("%-5d\n",123);//这里的负号就会改变对齐方式为左对齐。
printf("%+d\n",12);//+12
printf("%-d\n",12);//-12
return 0;
}

结果图如下:
在这里插入图片描述
②限定小数位数:
输出小数时,有时希望限定小数的位数。
例:小数点后面只保留两位,占位符可以写成%.2f。

#include <stdio.h>
int main()
{
printf("%6.2f\n",0.5);//至少打印6位
return 0;
}

结果如下:
在这里插入图片描述
最小宽度和小数位数这两个限定值,都可以用*代替,通过printf()的参数传入。

#include <stdio.h>
int main()
{
printf("%*.*f\n",6,2,0.5);//通过后面的6和2来给*传参。
return 0;
}

3.scanf的介绍

printf —— 输出,scanf ——输入
& —— 取地址符号,如果变量是指针变量,就不用加&运算符。
基本用法:scanf使用时包含头文件<stdio.h>。
一次读一个变量:

#include <stdio.h>
int main()
{
int score = 0;
scanf("%d",&score);//12
printf("%d\n",score);//12
return 0;
}

一次读多个变量:

#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
float x = 0.0f;
float y = 0.0f;
scanf("%d%d%f%f",&i,&j,&x,&y);//一次读多个变量
return 0;
}

scanf()处理用户输入的原理是:从第一个数读遇到不符合就终止,下一次从上一次读到最后的那个开始。
例:

 #include <stdio.h>
 int main()
{
 int x;
 float y;
 // 用户输入"    -13.45e12# 0" 
 scanf("%d", &x);
 printf("%d\n", x);//-13
 scanf("%f", &y);
 printf("%f\n", y);//0.45e12
 return 0;
}

scanf()会过滤空白字符,包括空格,制表符,换行符等。0.45e12 —— 在计算机中可能无法精确保存小数。
scanf返回值:
①scanf返回值是一个整数,表示成功读取的变量个数。
②如果没有读取任何项,或者匹配失败,则返回0。
③如果在成功读取任何数据前,发生了读取错误或者遇到读取文件末尾,则返回常量EOF(-1),(EOF —— end of file文件结束的标志)。

用代码验证:

#include <stdio.h>
 int main()
{
 int a = 0;
 int b = 0;
 float f = 0.0f;
 int r = scanf("%d %d %f", &a, &b, &f);//第一种和第二种的验证正常输入即可,第三种可按三次ctrl+z。
 //第一: 12 34 0.35
 //第二: 不输入任何内容
 printf("a=%d b=%d f=%f\n", a, b, f);
 printf("r = %d\n", r);//3,0,-1
 return 0;
}

二、VS中使用的一些小技巧

1、按ctrl,划动鼠标滚轮就可变化字体大小
2、ctrl+k+c —— 注释,ctrl+k+u —— 取消注释
3、Home —— 行首,End —— 行末
4、3次ctrl+z代码运行中断结束。
5、1次ctrl+c代码运行强制结束。

三、解决在VS中scanf报错的问题

1、报错问题及解决步骤

scanf函数在VS上的报错!VS说:scanf函数不安全,建议使用scanf_s。
如下图所示:
在这里插入图片描述
上述VS给出的处理意见是使用VS给的scanf_s,或者如果想让这个描述(错误)失效,就在第一行加上:#define_CRT_SECURE_NO_WARNINGS 1
初学的时候不建议使用scanf_s,为什么呢?
因为scanf_s函数是VS2022提供的,不是C语言提供的。如果你在代码使用了scanf_s函数,你的代码只能在VS上编译,其他编译器不认识!降低了代码的移植性。
解决办法:
①一次性办法
只要在使用scanf函数的.c文件的第一行加上:#define_CRT_SECURE_NO_WARNINGS 1
②一劳永逸的解决办法
本质:在vs上新建.c / .cpp文件的时候,其实拷贝的是newc++file.cpp这个文件。
那么在newc++file.cpp文件加上:
#define_CRT_SECURE_NO_WARNINGS 1
以后新建的.c / .cpp的文件中都会包含这句代码。
1.如果没有修改权限,可以拷贝到桌面上修改后,记得再考贝回去。
2.新建.c文件的时候,不要用[紧凑视图]。

2、解决问题的应用eyething的下载

这里建议使用eyething这个应用路径搜索软件。
下载路径:https://www.voidtools.com/zh-cn/downloads/
1.首先查看自己电脑的配置:
在这里插入图片描述
2.根据自己的系统下载我这里是64位:
在这里插入图片描述
3.双击安装包:
在这里插入图片描述
4.直接根据默认安装即可
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里说明安装完毕。

3、scanf问题解决详情

1.在eyething中搜索newc++file.cpp,选择地址中有2022的路径。
在这里插入图片描述
2.鼠标右击该文件点打开路径
在这里插入图片描述
3.将该文件移到桌面,在桌面以记事本方式打开加上这句话:#define_CRT_SECURE_NO_WARNINGS 1
在这里插入图片描述
在这里插入图片描述
5.将修改的文件移到原路径底下
在这里插入图片描述
到这里问题就彻底解决了。

四、总结

本章内容涵盖了print和scanf的基本介绍,还有scanf的返回值问题以及scanf的越界访问问题的解决方法,还有VS上scanf报错的原由及解决办法,这里还用保姆级教程介绍eyething的安装步骤。希望本次讲解能够解决大家VS上scanf报错的问题,加强大家对printf和scanf的理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值