【问题标题】:should I create a global buffer in C我应该在 C 中创建一个全局缓冲区吗
【发布时间】:2021-10-14 12:36:49
【问题描述】:
#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 来读取来自用户的输入是创建全局缓冲区的好习惯吗?

【问题讨论】:

  • 您是否有理由避免在 main 中定义缓冲区?
  • 是的,我想将它用于所有功能
  • 然后让它成为全局看起来很好,只要所有使用它的函数也在同一个 .c 文件中定义。如果需要访问多个文件,那么您也需要在标头中声明缓冲区。
  • 我想说最好的做法是避免使用全局变量。
  • 如何为所有函数创建缓冲区

标签: c scanf buffer fgets


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    相关资源
    最近更新 更多