scanf()函数的用法和实践

本文深入讲解C/C++语言中scanf()函数的用法,包括格式化输入、常见错误及其对策。通过实例帮助初学者掌握正确使用方法。

 

scanf()函数的用法和实践

摘要:

本文阐述了基于ANSI,Win 95,Win NT上的 C/C++语言中scanf()函数的用法,以及在实际使用中常见错误及对策。

关键词

scanf()

一、             序言

在优快云论坛的C/C++版块,我时常见到“对于scanf()函数的用法、及出现的各种错误而迷惑”的帖子,萌发了我写这篇文章的念头。文中结合自身在学习和编程中对它的认识和体会,以具体示例阐述问题,目的在于使得初学者能够正确使用scanf()函数,少走不必要的弯路。

二、             scanf()函数的用法

scanf()函数是格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。

其调用格式为:      scanf("<格式化字符串>",<地址表>);

格式化字符串包括以下三类不同的字符;

1、 格式化说明符:

格式化说明符与printf()函数中的格式说明符基本相同。但和printf()函数中格式字符串的用法有一些小区别。我们来看下面这个表。

格式字符

说明

%d

从键盘输入十进制整数

%o

从键盘输入八进制整数

%x

从键盘输入十六进制整数

%c

从键盘输入一个字符

%s

从键盘输入一个字符串

%f

从键盘输入一个实数

%e

与%f的作用相同

附加格式说明字符表

字符

说明

L

输入"长"数据

H

输入"短"数据

M

指定输入数据所占宽度

*

空读一个数据

2、    空白字符: 空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符。

3、    非空白字符: 一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。

地址表是需要读入的所有变量的地址,而不是变量本身。这与printf()函数完全不同,要特别注意。各个变量的地址之间同","分开。

例如:

#include <stdio.h>

void main()

{

       int i, j;

       printf("i, j=?\n");

       scanf("%d, %d", &i, &j);

}

上例中的scanf()函数先读一个整型数,然后把接着输入的逗号剔除掉,最后读入另一个整型数。如果","这一特定字符没有找到,scanf()函数就终止。若参数之间的分隔符为空格,则参数之间必须输入一个或多个空格。

说明:

(1)          对于字符串数组或字符串指针变量,由于数组名和指针变量名本身就是地址,因此使用scanf()函数时,不需要在它们前面加上"&"操作符。

例如:

#include <stdio.h>

void main()

{

       char *p, str[20];

      

              p = new char[20];

             

          scanf("%s", p); /*从健盘输入字符串*/

          scanf("%s", str);

          printf("%s\n", p); /*向屏幕输出字符串*/

          printf("%s\n", str);

}

(2)          可以在格式化字符串中的"%"各格式化规定符之间加入一个整数,表示任何读操作中的最大位数。

如上例中若规定只能输入10字符给字符串指针p,则第一条scanf() 函数语句变为:scanf("%10s", p);

程序运行时一旦输入字符个数大于10,p就不再继续读入,而后面的一个读入函数即scanf("%s", str)就会从第11个字符开始读入。

(3)             scanf()函数中没有精度控制。

如: scanf("%5.2f",&a); 是非法的。不能企图用此语句输入小数为2位的实数。

(4)             scanf中要求给出变量地址,如给出变量名则会出错

如 scanf("%d",a);是非法的,应改为scnaf("%d",&a);才是合法的。

<think>我们正在讨论scanf函数的使用方法。根据引用内容,我们可以总结出scanf函数的基本用法注意事项。 用户的问题:我想了解如何在C语言中使用scanf函数 请问C语言scanf函数的使用方法 回答结构: 1. 概述scanf函数的功能原型 2. 基本用法(格式字符串、变量前的取地址符&amp;) 3. 输入控制符参数对应关系 4. 常见问题(如忘记&amp;、格式字符串中多余字符、缓冲区问题等) 5. 安全性问题(scanf_s介绍) 6. 示例代码 7. 使用建议 注意:根据引用[3],需要区分scanfscanf_s,并注意回车符换行符的区别。 我们将按照上述结构进行回答,并在适当位置添加引用标记。</think>### C语言中`scanf`函数的使用方法详解 `scanf`函数是C语言标准库中用于从标准输入(通常是键盘)读取格式化数据的关键函数,其原型定义在`<stdio.h>`头文件中: ```c #include <stdio.h> int scanf(const char *format, ...); ``` #### 一、核心用法 1. **基本语法**: ```c scanf("格式控制字符串", &amp;变量1, &amp;变量2, ...); ``` - 格式控制字符串:包含**格式说明符**(如`%d`, `%f`等) - `&amp;`运算符:获取变量内存地址(指针) 2. **常用格式说明符**: | 说明符 | 数据类型 | 示例输入 | 代码示例 | |--------|--------------|------------|-------------------------| | `%d` | 整数 | `42` | `scanf("%d", &amp;num);` | | `%f` | 浮点数 | `3.14` | `scanf("%f", &amp;pi);` | | `%c` | 单个字符 | `'A'` | `scanf("%c", &amp;ch);` | | `%s` | 字符串 | `"Hello"` | `scanf("%s", str);` | | `%lf` | 双精度浮点数 | `2.71828` | `scanf("%lf", &amp;e);` | 3. **多变量输入**: ```c int age; float height; scanf("%d %f", &amp;age, &amp;height); // 输入:25 1.75 ``` #### 二、关键注意事项 1. **必须使用`&amp;`取地址符**(字符串除外)[^2]: ```c int num; scanf("%d", &amp;num); // 正确 scanf("%d", num); // 错误!导致段错误 ``` 2. **格式控制字符串应简洁**: ```c scanf("%d,%f", &amp;age, &amp;height); // 输入必须带逗号:25,1.75 ``` 3. **缓冲区处理问题**: - 输入`%c`前清空缓冲区: ```c int num; char ch; scanf("%d", &amp;num); while(getchar() != '\n'); // 清空回车符 scanf("%c", &amp;ch); // 安全读取字符 ``` 4. **返回值检查**: ```c if(scanf("%d", &amp;num) != 1) { printf("输入错误!"); // 错误处理 } ``` #### 三、安全输入实践 1. **限制字符串长度**(防止溢出): ```c char name[20]; scanf("%19s", name); // 保留1字节给'\0' ``` 2. **使用`scanf_s`(Windows平台)**: ```c char buf[10]; scanf_s("%9s", buf, sizeof(buf)); // 需指定缓冲区大小[^3] ``` #### 四、完整示例 ```c #include <stdio.h> int main() { int age; float salary; char name[30]; printf("请输入姓名、年龄薪资:"); if(scanf("%29s %d %f", name, &amp;age, &amp;salary) == 3) { printf("姓名:%s\n年龄:%d\n薪资:%.2f\n", name, age, salary); } else { printf("输入格式错误!\n"); } return 0; } ``` > 输入示例:`John 30 8500.50` #### 五、常见错误解决方案 | 错误现象 | 原因 | 解决方法 | |-------------------------|-----------------------|------------------------------| | 程序跳过`scanf` | 缓冲区残留`\n` | 输入前用`while(getchar()!='\n');`清空 | | 输入字符串包含空格截断 | `%s`遇到空格停止 | 用`fgets(name, sizeof(name), stdin)`代替 | | 浮点数精度丢失 | `float`用`%lf`读取 | 匹配类型:`float`用`%f`, `double`用`%lf` | | 输入非数字导致死循环 | 未处理错误输入 | 检查返回值并清空缓冲区 | > **关键提示**:在循环中使用`scanf`时,务必处理输入错误缓冲区残留字符[^2]。对于生产环境,建议使用`fgets()`+`sscanf()`组合提高健壮性。 --- ### 相关问题 1. 如何安全处理`scanf`输入字符串时的缓冲区溢出风险? 2. `scanf`与`fgets`函数在输入处理上有哪些本质区别? 3. 在循环中使用`scanf`时如何避免无限循环? 4. 不同编译器对`scanf_s`的支持有哪些差异? 5. 如何用`sscanf`解析复杂格式的字符串数据?
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值