我应该在 C 中创建一个全局缓冲区吗
should I create a global buffer in 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
来读取用户的输入是否正在创建全局缓冲区的良好做法?
is creating a global buffer good practice?
最佳做法是尽可能限制对象(又名变量)的范围。这种转化为“如果任务可以用较小范围的变量同样好地解决,则应避免使用全局变量”
所以在引入全局之前你应该问问自己:为什么?您通过引入全局变量来解决什么问题?
您问题中的信息没有告诉我们您为什么需要全局 buffer
而不是在需要时定义局部 buffer
。
在现代计算机上,在函数内定义 2K 缓冲区通常不是问题。通常不涉及性能损失。通常不涉及内存问题(因为典型的堆栈大小要大得多)。
根据问题中给出的信息,答案是:“这是不好的做法 - 不要使用全局变量”。
OT:
它可能与真正的问题无关,但是您的代码很奇怪,因为您在同一个缓冲区上两次调用 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");
};
#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
来读取用户的输入是否正在创建全局缓冲区的良好做法?
is creating a global buffer good practice?
最佳做法是尽可能限制对象(又名变量)的范围。这种转化为“如果任务可以用较小范围的变量同样好地解决,则应避免使用全局变量”
所以在引入全局之前你应该问问自己:为什么?您通过引入全局变量来解决什么问题?
您问题中的信息没有告诉我们您为什么需要全局 buffer
而不是在需要时定义局部 buffer
。
在现代计算机上,在函数内定义 2K 缓冲区通常不是问题。通常不涉及性能损失。通常不涉及内存问题(因为典型的堆栈大小要大得多)。
根据问题中给出的信息,答案是:“这是不好的做法 - 不要使用全局变量”。
OT:
它可能与真正的问题无关,但是您的代码很奇怪,因为您在同一个缓冲区上两次调用 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");
};