首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >printf和scanf的介绍以及VS解决scanf报错问题

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

原创
作者头像
四念处茫茫
发布2025-01-26 09:18:25
发布2025-01-26 09:18:25
37000
代码可运行
举报
文章被收录于专栏:C语言C语言
运行总次数:0
代码可运行

前言

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

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

1.占位符

1.1printf中的占位符介绍

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

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

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

如:

代码语言:c
代码运行次数:0
运行
复制
#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不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格。如果要强制跳过字符前的空白字符,可以写成:

代码语言:c
代码运行次数:0
运行
复制
scanf(" %c",&ch);//即%c前加一个空格,表示跳过零个或多个空白字符。

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

例:

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

%s不会包含空白字符,无法读取多个字符,除非多个%s一起使用。scanf()遇到%s占位符,会在字符串变量末尾存储一个空字符\0。

scanf()将字符串读入字符数组时,不会检测字符串是否超过了数组长度。所以,储存字符串时,很有可能会超过数组的边界,导致预想不到的结果。为防止这种情况,使%s占位符时,应该指定读入字符串的最长长度,即写成%ms,其中的m是一个整数,表示读取字符串的最大长度,后面的字符将被丢弃。

2.printf的介绍

printf: print —— 打印, f——format 格式

基本用法:按照指定格式打印数据,使用该函数要包含头文件<stdio.h>。

输出格式:printf()可以定制占位符的输出格式。

①限制宽度:

代码语言:c
代码运行次数:0
运行
复制
#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。

代码语言:c
代码运行次数:0
运行
复制
#include <stdio.h>
int main()
{
printf("%6.2f\n",0.5);//至少打印6位
return 0;
}

结果如下:

最小宽度和小数位数这两个限定值,都可以用*代替,通过printf()的参数传入。

代码语言:c
代码运行次数:0
运行
复制
#include <stdio.h>
int main()
{
printf("%*.*f\n",6,2,0.5);//通过后面的6和2来给*传参。
return 0;
}

3.scanf的介绍

printf —— 输出,scanf ——输入

& —— 取地址符号,如果变量是指针变量,就不用加&运算符。

基本用法:scanf使用时包含头文件<stdio.h>。

一次读一个变量:

代码语言:c
代码运行次数:0
运行
复制
#include <stdio.h>
int main()
{
int score = 0;
scanf("%d",&score);//12
printf("%d\n",score);//12
return 0;
}

一次读多个变量:

代码语言:c
代码运行次数: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()处理用户输入的原理是:从第一个数读遇到不符合就终止,下一次从上一次读到最后的那个开始。

例:

代码语言:c
代码运行次数:0
运行
复制
 #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文件结束的标志)。

用代码验证:

代码语言:c
代码运行次数:0
运行
复制
#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的理解。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、printf和scanf的介绍和占位符
    • 1.占位符
      • 1.1printf中的占位符介绍
      • 1.2scanf中占位符的介绍
    • 2.printf的介绍
    • 3.scanf的介绍
  • 二、VS中使用的一些小技巧
  • 三、解决在VS中scanf报错的问题
    • 1、报错问题及解决步骤
    • 2、解决问题的应用eyething的下载
    • 3、scanf问题解决详情
  • 四、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档