31.【C语言】详解scanf

01.定义

scanf()用于读取用户的键盘输入

使用前加上

#include <stdio.h>

02.基础用法

int n=0;
scanf("%d",&n);

注意:

1.scanf() 传递的是地址,必须取地址&n ,如果这里的变量是指针变量(比如字符串变量),那就不用加& ;

char arr[5]={0};
scanf("%s",arr);

数组名就是地址 

如果想一次性输入多组值

scanf("%d %f %lf %d",a,b,c,d);

2.scanf() 处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符等 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
    int a = 0;
    float b = 0;
    double c = 0;
    int d = 0;
    scanf("%d %f %lf %d",& a,& b, &c, &d);
    printf("%d %f %lf %d", a, b, c, d);
    return 0;
}

03.工作原理

用户的输入先放入缓存,等到按下回车键后,按照占位符对缓存进行解读,解读用户输入时,会从上一次解读遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符为止

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
  int x=0;
  float y=0;
  scanf("%d", &x);
  printf("%d\n", x);
  scanf("%f", &y);
  printf("%f\n", y);
  return 0;
}

类似0.45这样的小数计算机不会准确存储 

04.返回值

整数,表示成功读取的变量个数;如果没有读取任何项,或者匹配失败,则返回0 ;如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量 EOF (-1)。
EOF - end of file 文件结束标志

可定义变量来接收返回值

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	int tmp= scanf("%d%d%d", &a,&b,&c);//这里做了两步,1.读取a,b,c 2.将返回值赋值给tmp
	printf("%d", tmp);
	return 0;
}

 

不同情况返回值不同,可用于判断是否正常读取值

05占位符

%c :单个字符。
%d :整数。
%f : float 类型浮点数。
%lf : double 类型浮点数(l小写)。
%Lf : long double 类型浮点数(L大写)。
%s :字符串。
%[] :在方括号中指定一组匹配的字符(比如%[0-9] ),遇到不在集合之中的字符,匹配将会
停止

注意:1.上面所有占位符之中,除了%c 以外,都会自动忽略起首的空白字符,%c 不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	char a =0;
	scanf("%c",&a);
	printf("%c",a);
	return 0;
}

 

*如果要强制跳过字符前的空白字符,可以写成scanf(" %c", &ch) ,即%c 前加上一个空格,表
跳过零个或多个空白字符

           2.scanf()有缺陷,读取数据的时,不会看目标空间是否能存的下数据

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	char arr[5] = { 0 };
	scanf("%s", arr);
	printf("%s", arr);
	return 0;
}

输入123abcd后

变量周围的堆栈已损坏

但是仍然可以正常打印

         3.%s从当前第一个非空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	char arr[5] = { 0 };
	scanf("%s", arr);
	printf("%s", arr);
	return 0;
}

原因加了\0

        4.解决第2点缺陷可以指定读入字符串的最长长度,即写成%[m]s ,其中的[m] 是一个整数,表示读取字符串的最大长度,后面的字符将被丢弃

scanf("%10s", arr);

相关推荐

  1. 入门c语言DAY4.1——scanf&printf详细介绍

    2024-07-19 11:22:04       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 11:22:04       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 11:22:04       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 11:22:04       62 阅读
  4. Python语言-面向对象

    2024-07-19 11:22:04       72 阅读

热门阅读

  1. sklearn基础教程

    2024-07-19 11:22:04       20 阅读
  2. codeforces round 941div2(a,b,c)

    2024-07-19 11:22:04       22 阅读
  3. C++中传递指针和传递引用应用场合的区别

    2024-07-19 11:22:04       15 阅读
  4. Vue项目的构建方式

    2024-07-19 11:22:04       24 阅读
  5. 【算法】数组中的第K个最大元素

    2024-07-19 11:22:04       23 阅读
  6. AI一点通:向量数据库FAISS 平均延迟的测量

    2024-07-19 11:22:04       23 阅读
  7. Jenkins及其相关插件的具体流程

    2024-07-19 11:22:04       26 阅读