首页 > 解决方案 > 我应该在 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;
}

我正在尝试使用fgetssscanf读取用户的输入是创建全局缓冲区的好习惯吗?

标签: cscanfbufferfgets

解决方案


是创建一个全局缓冲区的好习惯吗?

最佳实践是尽可能地限制对象(又名变量)的范围。这种转化为“如果可以使用较小范围的变量同样好地解决任务,则应避免使用全局变量”

因此,在引入全局变量之前,您应该问自己:为什么?您通过引入全局变量来解决什么问题?

您问题中的信息并没有告诉我们您为什么想要全局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");
};

推荐阅读