C 语言用户输入详解:scanf、fgets、内存地址解析及实用指南

本文涉及的产品
应用实时监控服务-应用监控,每月50GB免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 您已经学习了 printf() 函数用于在 C 语言中输出值。要获取用户输入,可以使用 scanf() 函数:

C 语言中的用户输入

您已经学习了 printf() 函数用于在 C 语言中输出值。

要获取用户输入,可以使用 scanf() 函数:

// 声明一个整数变量,用于存储我们从用户那里获得的数字
int myNum;

// 提示用户输入一个数字
printf("请输入一个数字:\n");

// 获取并保存用户输入的数字
scanf("%d", &myNum);

// 输出用户输入的数字
printf("您的数字是:%d", myNum);

scanf() 函数接受两个参数:变量的格式说明符(在本例中为 %d)和引用运算符(&myNum),用于存储变量的内存地址。

多个输入

scanf() 函数还允许进行多个输入(例如,在下面的例子中,用户可以同时输入一个整数和一个字符):

// 创建一个 int 和一个 char 变量
int myNum;
char myChar;

// 提示用户输入一个数字和一个字符
printf("请输入一个数字和一个字符,然后按回车:\n");

// 获取并保存用户输入的数字和字符
scanf("%d %c", &myNum, &myChar);

// 打印数字
printf("您的数字是:%d\n", myNum);

// 打印字符
printf("您的字符是:%c\n", myChar);

获取字符串输入

您也可以获取用户输入的字符串:

// 声明一个字符串
char firstName[30];

// 提示用户输入一些文本
printf("请输入您的名字:\n");

// 获取并保存文本
scanf("%s", firstName);

// 输出文本
printf("你好,%s", firstName);

注意:当在 scanf() 中处理字符串时,您必须指定字符串/数组的大小(在本例中我们使用了一个非常高的数字 30,但至少可以确定它可以存储足够的名字首字母),并且您不必使用引用运算符 (&)。

但是,scanf() 函数有一些限制:它将空格(空白、制表符等)视为终止符,这意味着它只能显示单个单词(即使您输入了许多单词)。例如:

char fullName[30];

printf("请输入您的全名:\n");
scanf("%s", &fullName);

printf("你好,%s", fullName);

// 请输入您的全名:John Doe
// 你好,John

从上面的例子中,您可能会期望程序打印 "John Doe",但它只打印 "John"

这就是为什么,在处理字符串时,我们经常使用 fgets() 函数来读取一行文本。请注意,您必须包含以下参数:字符串变量的名称、sizeof(string_name)stdin

char fullName[30];

printf("请输入您的全名:\n");
fgets(fullName, sizeof(fullName), stdin);

printf("你好,%s", fullName);

// 请输入您的全名:John Doe
// 你好,John Doe

使用 scanf() 函数获取单个单词作为输入,而对于多个单词,则使用 fgets() 函数。

C 语言中的内存地址

当 C 语言中创建一个变量时,就会为该变量分配一个内存地址。

内存地址是变量在计算机内存中存储的位置。当我们为变量赋值时,值就存储在这个内存地址中。要访问它,可以使用引用运算符 (&),结果表示变量的存储位置:

int myAge = 43;
printf("%p", &myAge); // 输出 0x7ffe5367e044

注意:内存地址是以十六进制形式表示的 (0x..)。在您的程序中,您可能不会得到相同的结果,因为这取决于变量在计算机内存中的存储位置。

您还应该注意,&myAge 通常被称为 "指针"。指针基本上是将变量的内存地址作为其值存储。要打印指针值,我们使用 %p 格式说明符。

为什么知道内存地址有用?

指针在 C 语言中很重要,因为它们允许我们操作计算机内存中的数据 - 这可以减少代码量并提高性能。

指针是 C 语言区别于其他编程语言(如 PythonJava)的一大特点。

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎 点赞、收藏、关注

相关文章
|
20天前
|
存储 监控 算法
探秘员工泄密行为防线:基于Go语言的布隆过滤器算法解析
在信息爆炸时代,员工泄密行为对企业构成重大威胁。本文聚焦布隆过滤器(Bloom Filter)这一高效数据结构,结合Go语言实现算法,帮助企业识别和预防泄密风险。通过构建正常操作“指纹库”,实时监测员工操作,快速筛查可疑行为。示例代码展示了如何利用布隆过滤器检测异常操作,并提出优化建议,如调整参数、结合日志分析系统等,全方位筑牢企业信息安全防线,守护核心竞争力。
|
9天前
|
存储 算法 安全
基于 Go 语言的公司内网管理软件哈希表算法深度解析与研究
在数字化办公中,公司内网管理软件通过哈希表算法保障信息安全与高效管理。哈希表基于键值对存储和查找,如用户登录验证、设备信息管理和文件权限控制等场景,Go语言实现的哈希表能快速验证用户信息,提升管理效率,确保网络稳定运行。
23 0
|
3月前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
222 14
|
3月前
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
87 8
|
3月前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
132 6
|
3月前
|
存储 算法 C语言
【C语言】深入浅出:C语言链表的全面解析
链表是一种重要的基础数据结构,适用于频繁的插入和删除操作。通过本篇详细讲解了单链表、双向链表和循环链表的概念和实现,以及各类常用操作的示例代码。掌握链表的使用对于理解更复杂的数据结构和算法具有重要意义。
1005 6
|
3月前
|
存储 网络协议 算法
【C语言】进制转换无难事:二进制、十进制、八进制与十六进制的全解析与实例
进制转换是计算机编程中常见的操作。在C语言中,了解如何在不同进制之间转换数据对于处理和显示数据非常重要。本文将详细介绍如何在二进制、十进制、八进制和十六进制之间进行转换。
115 5
|
3月前
|
C语言 开发者
【C语言】断言函数 -《深入解析C语言调试利器 !》
断言(assert)是一种调试工具,用于在程序运行时检查某些条件是否成立。如果条件不成立,断言会触发错误,并通常会终止程序的执行。断言有助于在开发和测试阶段捕捉逻辑错误。
71 5
|
4月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
737 1
|
15天前
|
存储 算法 Java
JVM: 内存、类与垃圾
分代收集算法将内存分为新生代和老年代,分别使用不同的垃圾回收算法。新生代对象使用复制算法,老年代对象使用标记-清除或标记-整理算法。
19 3

推荐镜像

更多