scanf介绍

1.scanf函数的介绍

1.1scanf

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

幕上的时候可以使用 printf 函数,下面看一个例子:

1 #include <stdio.h>
2
3 int main()
4 {
5     int score = 0;
6     printf("请输入成绩:");
7     scanf("%d", &score);
8     printf("成绩是: %d\n", score);
9     return 0;
10 }
//请输入成绩:100
//成绩是:100

注:标准输入一般指的就是键盘,标准输出一般指的就是屏幕

那接下来我们介绍一下 scanf 函数。

1.1.2基本用法

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

程序运行到这个语句时,会停下来,等待用户从键盘输入。

用户输入数据、按下回车键后,scanf() 就会处理用户的输入,将其存入变量。

它的原型定义在头文件 <stdio.h>

作为和printf函数常见且常用的函数,scanf() 的语法跟 printf() 类似。

1.scanf("%d",&i);

它的第一个参数是一个格式字符串,里面会放置占位符(与 printf() 的占位符基本一致),告诉编

译器如何解读用户的输入,需要提取的数据是什么类型。

这是因为 C 语言的数据都是有类型的,scanf() 必须提前知道用户输入的数据类型,才能处理数

据。

它的其余参数就是存放用户输入的变量,格式字符串里面有多少个占位符,就有多少个变量。

上面示例中,scanf() 的第一个参数%d,表示用户输入的应该是一个整数,%d 就是一个占位符,%

占位符的标志,d表示整数。第二个参数 &i 表示,将用户从键盘输入的整数存入变量 i

注意:变量前面必须加上&运算符(指针变量除外),因为 scanf() 传递的不是值,而是地址,即

将变量 i 的地址指向用户输入的值。

如果这里的变量是指针变量(比如字符串变量),那就不用加 & 运算符。

下面是一次将键盘输入读入多个变量的例子。

1 scanf("%d%d%f%f", &i, &j, &x, &y);

上面示例中,格式字符串 %d %d %f %f ,表示用户输入的前两个是整数,后两个是浮点数,比如

1  -20  3.4  -4.0e3 。这四个值依次放入 i 、j 、x 、y 四个变量。

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

所以,用户输入的数据之间,有一个或多个空格不影响 scanf() 解读数据。另外,用户使用回车

键,将输入分成几行,也不影响解读。

1 1
2 -20
3 3.4
4 -4.0e3

上面示例中,用户分成四行输入,得到的结果与一行输入是完全一样的。每次按下回车键以后,

scanf() 就会开始解读,如果第一行匹配第一个占位符,那么下次按下回车键时,就会从第二个占

位符开始解读。
 
scanf() 处理用户输入的原理是,用户的输入先放入缓存,等到按下回车键后,按照占位符对缓存

进行解读。

解读用户输入时,会从上一次解读遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合

条件的字符为止。

1 #include <stdio.h>
2
3 int main()
4 {
5     int x;
6     float y;
7
8     // 用户输入 "  -13.45e12# @"
9     scanf("%d", &x);
10    printf("%d\n", x);
11    scanf("%f", &y);
12    printf("%f\n", y);
13    return 0;
14 }

上面示例中,scanf() 读取用户输入时,%d 占位符会忽略起首的空格,从 - 处开始获取数据,读

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


第二次调用 scanf() 时,就会从上一次停止解读的地方,继续往下读取。这一次读取的首字符是 .

,由于对应的占位符是 %f ,会读取到 .45e12 ,这是采用科学计数法的浮点数格式。后面的 #

属于浮点数的有效字符,所以会停在这里。
 
由于 scanf() 可以连续处理多个占位符,所以上面的例子也可以写成下面这样。

1 #include <stdio.h>
2
3 int main()
4 {
5     int x;
6     float y;
7
8     // 用户输入 "  -13.45e12# @"
9     scanf("%d%f", &x, &y);
10    return 0;
11 }

1.1.3 scanf的返回值

scanf() 的返回值是一个整数,表示成功读取的变量个数。

如果没有读取任何项,或者匹配失败,则返回 0

如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量 EOF(-1)。

EOF - end of file 文件结束标志

1 #include <stdio.h>
2 int main()
3 {
4     int a = 0;
5     int b = 0;
6     float f = 0.0f;
7     int r = scanf("%d %d %f", &a, &b, &f);
8     printf("a=%d b=%d f=%f\n", a, b, f);
9     printf("r = %d\n", r);
10    return 0;
11 }

输入输出测试:(注:下面调试内容是VS2022中,不同的编译环境中提示操作和调试内容可能会略有不

同)

如果输出2个数后,按ctrl+z,提前结束输入:

在VS环境中按3次ctrl+z,才结束了输入,我们可以看到r是2,表示正确读取了2个数值

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

1.2占位符

scanf() 常用的占位符如下,与 printf() 的占位符基本一致。
 
- %c:字符。
- %d:整数。
- %f:float 类型浮点数。
- %lf:double 类型浮点数。
- %Lf:long double 类型浮点数。
- %s:字符串。
- %[]:在方括号中指定一组匹配的字符(比如 %[0-9] ),遇到不在集合之中的字符,匹配将会停止。

 
上面所有占位符之中,除了 %c 以外,都会自动忽略起首的空白字符。%c 不忽略空白字符,总是

返回当前第一个字符,无论该字符是否为空格。

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

跳过零个或多个空白字符。
 
下面要特别说一下占位符 %s ,它其实不能简单地等同于字符串。它的规则是,从当前第一个非空

白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止。

因为 %s 不会包含空白字符,所以无法用来读取多个单词,除非多个 %s 一起使用。这也意味着,

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

会在字符串变量末尾存储一个空字符 \0

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

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

指 定读入字符串的最长长度,即写成 %[m]s ,其中的 [m] 是一个整数,表示读取字符串的最大长

度,后面的字符将被丢弃。

1 #include <stdio.h>
2
3 int main()
4 {
5     char name[11];
6     scanf("%10s", name);
7
8     return 0;
9 }

上面示例中,name 是一个长度为11的字符数组,scanf() 的占位符 %10s 表示最多读取用户输入

10个字符,后面的字符将被丢弃,这样就不会有数组溢出的风险了。

1.2.1赋值占位符

有时,用户的输入可能不符合预定的格式。

1 #include <stdio.h>
2
3 int main()
4 {
5     int year = 0;
6     int month = 0;
7     int day = 0;
8     scanf("%d-%d-%d", &year, &month, &day);
9     printf("%d %d %d\n", year, month, day);
10    return 0;
11 }

上面示例中,如果用户输入 2020-01-01 ,就会正确解读出年、月、日。问题是用户可能输入其他

格式,比如 2020/01/01 ,这种情况下,scanf() 解析数据就会失败。
 
为了避免这种情况,scanf() 提供了一个赋值忽略符(assignment suppression character)*

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

1 #include <stdio.h>
2
3 int main()
4 {
5     int year = 0;
6     int month = 0;
7     int day = 0;
8     scanf("%d*c%d*c%d", &year, &month, &day);
9     return 0;
10 }

上面示例中,%*c 就是在占位符的百分号后面,加入了赋值忽略符 * ,表示这个占位符没有对应的

变量,解读后不必返回。

以上内容就是有关scanf函数的内容,欢迎大家的补充,感谢大家的观看!

<think>好的,我现在需要帮助用户了解C语言中的scanf函数。首先,根据用户的问题,他想知道scanf的相关信息或用法。让我先回忆一下scanf的基本知识,然后结合提供的引用内容来组织回答。 首先,scanf函数是C语言中用于从标准输入读取数据的函数,属于stdio.h库。它使用格式说明符来解析输入,并将值存储到变量中。用户提供的引用[1]提到了这一点,还提到scanf可以处理不同的数据类型。需要强调格式说明符的正确使用,比如%d对应整数,%f对应浮点数等。 接下来,用户可能关心语法结构。引用[1]给出了scanf的语法示例,应该解释清楚参数顺序,首先是格式字符串,然后是变量地址。例如,scanf("%d %f", &i, &f),这里要注意使用&符号获取变量地址,否则会导致错误。 然后,用户可能遇到的问题之一是安全性警告,比如C4996错误。引用[3]和[4]提到在Visual Studio中使用scanf会提示不安全,建议使用scanf_s或通过宏定义屏蔽警告。这部分需要详细说明解决方法,比如使用#define _CRT_SECURE_NO_WARNINGS或者改用更安全的函数。 此外,用户提供的引用[2]中有一个文件操作的例子,可能与scanf无关,但需要确认是否相关。不过当前问题集中在scanf,所以可能不需要涉及该部分。 需要注意的常见错误包括忘记使用&符号,格式说明符与实际变量类型不匹配,以及输入缓冲区的问题(比如残留的换行符导致后续输入被跳过)。这些都需要在回答中提到,并提供解决建议,比如在读取字符前清空缓冲区。 然后,根据用户提供的引用内容,引用[1]详细说明了scanf的语法和功能,引用[3]和[4]涉及错误处理,这些都是回答的重要部分。需要将这些内容自然地融入回答中,并在适当的位置添加引用标识。 最后,按照用户要求生成相关问题。相关问题应围绕scanf的用法、错误处理、替代函数、安全性等方面展开,确保覆盖用户可能感兴趣的扩展内容。 总结回答结构:介绍scanf的基本功能,语法,格式说明符示例,常见错误和注意事项,安全性问题及解决方案,最后生成相关问题。</think>### `scanf`函数详解 `scanf`是C语言中用于从标准输入(如键盘)读取数据的函数,属于`stdio.h`库。它通过格式说明符(如`%d`、`%f`)解析输入数据,并将结果存储到指定变量中[^1]。 #### 1. 基本语法 ```c int scanf(const char *format, ...); ``` - **参数**: - `format`:格式字符串,定义输入数据的类型和顺序。 - `...`:变量地址列表,用于存储输入值。 示例: ```c int age; float height; scanf("%d %f", &age, &height); // 输入"25 1.75"后,age=25,height=1.75 ``` #### 2. 格式说明符 | 说明符 | 数据类型 | 示例输入 | |--------|----------------|----------------| | `%d` | 整数 | `42` | | `%f` | 浮点数 | `3.14` | | `%c` | 单个字符 | `A` | | `%s` | 字符串(无空格)| `Hello` | | `%lf` | 双精度浮点数 | `2.71828` | #### 3. 常见错误与注意事项 1. **变量地址缺失** ```c scanf("%d", age); // 错误!缺少&符号 scanf("%d", &age); // 正确 ``` 2. **输入缓冲区问题** 输入后按回车会残留换行符`\n`,可能影响后续`%c`读取。解决方案: ```c scanf(" %c", &ch); // 添加空格跳过空白字符 ``` 3. **安全性警告(C4996)** 在Visual Studio中,`scanf`可能触发警告,建议: - 使用`scanf_s`(需指定缓冲区大小): ```c char str[10]; scanf_s("%9s", str, sizeof(str)); // 限制输入长度[^3] ``` - 添加宏定义屏蔽警告: ```c #define _CRT_SECURE_NO_WARNINGS // 在文件开头添加[^4] ``` #### 4. 返回值 - **成功**:返回成功读取的数据项数量。 - **失败**:返回`EOF`(如输入结束或格式不匹配)。 ```c int result = scanf("%d %f", &age, &height); if (result != 2) { printf("输入错误!"); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值