兄弟们说实话,我感觉我今天特别的兴奋,刚刚发完一篇我就又发了一另一篇文章,

(〜)〜(〜)〜(〜)〜

像我这么难得的新人作者,来点赞来点关注,感谢各位帅哥美女。


我们刚刚介绍了printf相关的一些知识。当然对于c语言关键的输入和输出,我们刚刚说了输出。接下来介绍的就是c语言中常见的输入函数scanf相关的知识。


一,scanf

当我们有了变量,我们需要给变量输⼊值就可以使⽤ scanf 函数,如果需要将变量的值输出在屏幕上

的时候可以使⽤ prinf 函数,下⾯看⼀个例⼦:

int main()
{
	int a = 0;
	printf("输入一个整数");
	scanf("%d", &a);

	printf("%d", a);
	return 0;

}

小白scanf------新手必备_数据

注意:标准输⼊⼀般指的就是键盘,标准输出⼀般指的就是屏幕

1.1,scanf使用方法

scanf() 函数⽤于读取⽤⼾的键盘输⼊。 程序运⾏到这个语句时,会停下来,等待⽤⼾从键盘输⼊。

⽤⼾输⼊数据、按下回⻋键后, scanf() 就将其存⼊变量。 scanf() 的语法跟 printf() 类似。

同时scanf它的第⼀个参数是整数,⾥⾯会放置占位符(与 printf() 的占位符基本⼀致)

告诉编 译器如何解读⽤⼾的输⼊,需要提取的数据是什么类型。这是因为 C 语⾔的数据都是有类型的, scanf() 必须提前知道⽤⼾输⼊的数据类型,才能处理数据,它的其余参数就是存放⽤⼾输⼊的变量,格式字符串⾥⾯小白scanf------新手必备_scanf知识_02

例如:一个简单的加法

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a, b = 0;
	printf("输入两个整数");
	scanf("%d %d", &a, &b);

	printf("%d+%d=%d\n", a, b, a + b);


	return 0;
}

小白scanf------新手必备_数据_03

在上面我们使用了一个取地址符号,如果是直接看这篇文章的人的,我在这里简单的说一下,scanf传递的不是值而是是地址,所以在这里我们使用有关地址的取地址符号。

#define _CRT_SECURE_NO_WARNINGS 1是VS关于scanf不安全所以使用了这个来表明我就使用

这个scanf

怎么一直出现#define _CRT_SECURE_NO_WARNINGS 1

哔哩哔哩上面:【C语言学习问题】VS2013编译器对函数不安全报错的解决办法】(点一下会跳到哔哩哔哩或者直接搜一下)可以解决


1.2scanf特点

scanf() 处理数值占位符时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等。

所以,⽤⼾输⼊的数据之间,有⼀个或多个空格不影响 scanf() 解读数据。另外,⽤⼾使⽤回⻋

键,将输⼊分成⼏⾏,也不影响解读

例如

int main()
{
	int a, b = 0;
	printf("输入两个整数");
	scanf("%d               %d", &a, &b);

	printf("%d+%d=%d\n", a, b, a + b);


	return 0;
}

小白scanf------新手必备_字符串_04

我们来看下面的例子:

int main()
{
	int a;
	float b;
  //我们输入-13.45e1#10
	scanf("%d %f", &a, &b);
	printf("%d %f", a, b);

	return 0;
}

小白scanf------新手必备_占位符_05

scanf() 读取⽤⼾输⼊时, %d 占位符会忽略起⾸的空格,从 - 处开始获取数据,读

取到 -13 停下来,因为后⾯的 . 不属于整数的有效字符。这就是说,占位符 %d 会读到 -13 ,然后后面的45算浮点数了

1.3scanf的返回值

你去使用函数的时候函数必然是会有返回值的,scanf() 的返回值是⼀个整数,表⽰成功读取的变量个数。 如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发⽣了读取错误或 者遇到读取到⽂件结尾,则返回常量 EOF即

例如

int main()
{
	int a = 0;
	int b = 0;
	int c = 0;

	int num =scanf("%d %d %d", &a, &b, &c);

	printf("%d %d %d\n", a, b, c);

	printf("%d", num);
	return 0;
}

小白scanf------新手必备_字符串_06

实现ctry+z按三下VS会停止:

当我们在上面输入两个数的时候,按三下ctry加z。Vs停止工作,那么scanf在运行的过程中就只读了两个数,所以我们的num返回为2,

他在读取第3个数的时候我们停止了。他读取失败,所以我们的字母c值为0

如果我们不输入值直接停止

小白scanf------新手必备_字符串_07


如果⼀个数字都不输⼊,直接按3次 ctrl+z ,输出的r是-1,也就是EOF;

1.4scanf() 常⽤的占位符

%c :字符。


%f : float 类型浮点数。

%lf : double 类型浮点数。

%Lf : long double 类型浮点数。

%s :字符串。

%[] :在⽅括号中指定⼀组匹配的字符(⽐如 %[0-9] ),遇到不在集合之中的字符,匹配将会

停⽌。

上⾯所有占位符之中,除了 %c 以外,都会⾃动忽略起⾸的空⽩字符。 %c 不忽略空⽩字符,总是返

回当前第⼀个字符,⽆论该字符是否为空格。

如果要强制跳过字符前的空⽩字符,可以写成 scanf(" %c", &) ,即 %c 前加上⼀个空格,表

⽰跳过零个或多个空⽩字符。

下⾯要特别说⼀下占位符 %s ,它其实不能简单地等同于字符串。它的规则是,从当前第⼀个⾮空⽩

字符开始读起,直到遇到空⽩字符(即空格、换⾏符、制表符等)为⽌








因为 %s 不会包含空⽩字符,所以⽆法⽤来读取多个单词,除⾮多个 %s ⼀起使⽤。这也意味着,

scanf() 不适合读取可能包含空格的字符串,⽐如书名或歌曲名。另外, scanf() 遇到 %s 占位

符,会在字符串变量末尾存储⼀个空字符 \0 。


scanf() 将字符串读⼊字符数组时,不会检测字符串是否超过了数组⻓度。所以,储存字符串时,

很可能会超过数组的边界,导致预想不到的结果。为了防⽌这种情况,使⽤ %s 占位符时,应该指定

读⼊字符串的最⻓⻓度,即写成 %[m]s ,其中的 [m] 是⼀个整数,表⽰读取字符串的最⼤⻓度,后

⾯的字符将被丢弃。

1.4.1例如%c的实例

int main()
{
	char a = 0;
	scanf("%c", &a);
	printf("%cxxxx", a);

	return 0;

}

小白scanf------新手必备_scanf知识_08


1.4.2例如%s的实例

int main()
{
	char a[20] = {0};
	scanf("%s", &a);
	printf("%s", a);

	return 0;

}

小白scanf------新手必备_占位符_09

1.4.3指定读⼊字符串的最⻓⻓度

int main()
{
	char a[20] = {0};
	scanf("%5s", &a);
	printf("%5s", a);

	return 0;

}

小白scanf------新手必备_字符串_10

1.5赋值忽略符

有时,⽤⼾的输⼊可能不符合预定的格式。

int main()
{
	int year = 0;
	int month = 0;
	int day = 0;

	scanf("%d-%d-%d", &year, &month, &day);
	printf("%d %d %d\n", year, month, day);
	return 0;
}

小白scanf------新手必备_字符串_11

错误的格式:

小白scanf------新手必备_scanf知识_12

小白scanf------新手必备_数据_13

为了避免这种情况, scanf() 提供了⼀个赋值忽略符(assignment suppression character) * 。

只要把 * 加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃。

int main()
{
	int year = 0;
	int month = 0;
	int day = 0;

	scanf("%d%*c%d%*c%d", &year, &month, &day);
	printf("%d %d %d\n", year, month, day);
	return 0;
}

小白scanf------新手必备_数据_14

我们在上面的代码中,两个%d中间加了一个%c,并且在c的前面加了一个*表明这两个%c我们不需要返回值,这样我们输入其他格式时都可以算对了。


小白scanf------新手必备_数据_15

最后谢谢各位老板

小白scanf------新手必备_数据_16