C 常量数组全局变量的替代方案?

C 常量数组全局变量的替代方案?,c,global-variables,constants,C,Global Variables,Constants,我在学校有一个重建printf的项目 我不想在我的代码中一直检查字符的格式说明符,因为我发现它既混乱又难看 现在,我已经找到了一种方法,创建一些全局常量数组,并使用它们进行检查。但是我不喜欢在我的代码中也有这么多全局变量 这是全局变量正常的情况之一吗?还是我应该用另一种方法来得到我想要的 以下是我如何开始的: 全局常量数组 我的头球 我想避免的是: 这些只是简单的原型,但我想知道是否有合适的方法使我的功能如此干净。这意味着,在我看来,如果可能的话,我希望避免这样做检查: if (c == 'd'

我在学校有一个重建printf的项目

我不想在我的代码中一直检查字符的格式说明符,因为我发现它既混乱又难看

现在,我已经找到了一种方法,创建一些全局常量数组,并使用它们进行检查。但是我不喜欢在我的代码中也有这么多全局变量

这是全局变量正常的情况之一吗?还是我应该用另一种方法来得到我想要的

以下是我如何开始的:

全局常量数组 我的头球 我想避免的是: 这些只是简单的原型,但我想知道是否有合适的方法使我的功能如此干净。这意味着,在我看来,如果可能的话,我希望避免这样做检查:

if (c == 'd' || c == 'i')
    //manage the integer flag
else if (c == 'o')
    //manage the octal flag, etc.
如果这是不可能的,最好的方法是我想避免的方法,请让我知道

谢谢大家的耐心,因为有时候很难找到好的做法

编辑: 我使用的解决方案: 虽然第一个解决方案对我在这种情况下应该做的事情有全局答案(在该文件中使用静态变量),但我已经结束了第二个答案中建议的事情,因为它符合我的需要,并且避免使用静态或全局变量

以下是我的函数代码:

static int32_t is_sp_integer(char c) {
  const char    *sp_integer;
  const char    *sp_ptr;

  sp_integer = "dDioOuUxX";
  sp_ptr = sp_integer;
  while (*sp_ptr != '\0')
  {
    if (*sp_ptr == c)
      return (sp_ptr - sp_integer);
    ++sp_ptr;
  }
  return (FAILURE);
}

谢谢大家

g_sp_integer
仅在
is_sp_integer
函数中使用,因此在此处定义它:

static int32_t  is_sp_integer(char c)
{
    const char  g_sp_integer[] = {
        'd',    //signed decimal int
        'i',    //signed decimal int
        'o',    //unsigned octal
        'u',    //unsigned decimal int
        'x',    //unsigned hex int
        'X',    //unsigned hex int (uppercase)
        '\0'
    };

    uint32_t    i;

    while (g_sp_integer[i] != '\0')
    {
        if (g_sp_integer[i] == c)
            return (i);
        ++i;
    }
    return (FAILURE);
}

这里是一个利用指针的稍微不同的实现。我认为它比使用阵列更有效

const char  *g_sp_integer= "diouxX";
static int32_t  is_sp_integer(char c)
{
    const char *p = g_sp_integer;
    while (*p) {
        if (*p == c)
            return (p - g_sp_integer);
        p++;
    }
    return (FAILURE);
}

这个怎么样:
strchr(c,“diouxX”)!=0
;此外,string.h中还有一组标准函数,即
isdigit
,您可以使用它来代替is\u sp\u integer。除了malloc、free、exit和write之外,我无法真正使用标准库。但当然,我可以编写代码并完成它。谢谢你的想法。@Serge关于
strchr(c,“diouxX”)!=0
,当
c==0
时,
strchr(c,“diouxX”)
返回一个非空指针。防止
c==0
@cbaillat执行许多相同的操作应该不会有问题。
const char g_sp_integer[]
-->
static const char g_sp_integer[]
,现在
g_sp_integer[]
只有文件作用域。它目前仅在那里使用,但我可能需要进行多次检查,因为我需要解析标签等等。不过谢谢你的建议,也许我会尝试这样做。谢谢如果您需要在多个函数中使用它,请使用
static
在文件范围中定义它,并从标题中删除
extern
声明,这样它在其他源文件中就不可见了。谢谢,我将这样做!好主意!我一定会尝试实现它,并检查它是否快一点!
static int32_t is_sp_integer(char c) {
  const char    *sp_integer;
  const char    *sp_ptr;

  sp_integer = "dDioOuUxX";
  sp_ptr = sp_integer;
  while (*sp_ptr != '\0')
  {
    if (*sp_ptr == c)
      return (sp_ptr - sp_integer);
    ++sp_ptr;
  }
  return (FAILURE);
}
static int32_t  is_sp_integer(char c)
{
    const char  g_sp_integer[] = {
        'd',    //signed decimal int
        'i',    //signed decimal int
        'o',    //unsigned octal
        'u',    //unsigned decimal int
        'x',    //unsigned hex int
        'X',    //unsigned hex int (uppercase)
        '\0'
    };

    uint32_t    i;

    while (g_sp_integer[i] != '\0')
    {
        if (g_sp_integer[i] == c)
            return (i);
        ++i;
    }
    return (FAILURE);
}
const char  *g_sp_integer= "diouxX";
static int32_t  is_sp_integer(char c)
{
    const char *p = g_sp_integer;
    while (*p) {
        if (*p == c)
            return (p - g_sp_integer);
        p++;
    }
    return (FAILURE);
}