c - 我应该在 C 中创建一个全局缓冲区吗
问题描述
#include <stdio.h>
char buffer[2048];
int main()
{
int a;
do {
printf("Enter an integer: ");
fgets(buffer, sizeof(buffer), stdin);
if (sscanf(buffer, "%d", &a) < 1)
printf("Invalid input\n");
} while (sscanf(buffer, "%d", &a) < 1);
return 0;
}
我正在尝试使用fgets
并sscanf
读取用户的输入是创建全局缓冲区的好习惯吗?
解决方案
是创建一个全局缓冲区的好习惯吗?
最佳实践是尽可能地限制对象(又名变量)的范围。这种转化为“如果可以使用较小范围的变量同样好地解决任务,则应避免使用全局变量”
因此,在引入全局变量之前,您应该问自己:为什么?您通过引入全局变量来解决什么问题?
您问题中的信息并没有告诉我们您为什么想要全局buffer
而不是在需要时仅定义本地buffer
。
在现代计算机上,在函数内定义 2K 缓冲区通常不是问题。通常不涉及性能损失。通常不涉及内存问题(因为典型的堆栈大小要大得多)。
因此,根据问题中给出的信息,答案是:“这是不好的做法 - 不要使用全局”。
旧时:
它可能与真正的问题无关,但是您的代码相当奇怪,因为您sscanf
在同一个缓冲区上调用了两次。为避免这种情况,您可以这样做:
while(1) {
printf("Enter an integer: ");
if (fgets(buffer, sizeof(buffer), stdin) == NULL) exit(1);
if (sscanf(buffer, "%d", &a) == 1) break;
printf("Invalid input\n");
};
推荐阅读
- docker - 是否可以使用 fluentd 动态设置日志路径?
- django - How to make comments serializer work with post serializer in django rest framework.?
- java - com.google.firebase.messaging.FirebaseMessagingException:调用 FCM 后端服务时出错
- loops - Pentaho 数据集成转换中的循环
- django - 只有在 {% load static %} 之后放置一个字符时,Django 网页才能正确显示
- python - 如何从 post 标记的句子中提取具有多种模式的块?
- google-cloud-platform - 在没有防火墙规则或允许的网络的情况下从 Macbook 连接到 Google Cloud SQL?
- node.js - mongodb可以发送没有循环的查询管道吗?
- c# - 如何在 Visual Studio 中创建和部署 Mono ASP.NET Web 项目?
- java - 如何在 Android Studio 中存储巨大的字符串数据?