C-我全局变量的替代方案,用于恒定数组



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

我不想在我的代码中一直检查字符的格式指定符,因为我觉得它很混乱,而且很难看。

到目前为止,我已经通过创建一些全局常数数组找到了一种方法,并使用这些数组进行检查。但是我也不喜欢在我的代码中拥有这么多全球变量的想法。

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

这是我开始的方式:

全局const数组

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)
    ''
};

我的标题

#ifndef  FT_PRINTF_H
# define  FT_PRINTF_H
# include <stdarg.h>
# include <stdint.h>
# include <stdlib.h>
# include "libft.h"
# define SUCCESS (int32_t)0
# define FAILURE (int32_t)-1
/*
** Those extern definitions are used to check the specifier flags
*/
extern const char   *g_sp_integer;
int ft_printf(const char *format, ...);
#endif

和我的printf函数

#include "ft_printf.h"
static int32_t  is_sp_integer(char c)
{
    uint32_t    i;
    while (g_sp_integer[i] != '')
    {
        if (g_sp_integer[i] == c)
            return (i);
        ++i;
    }
    return (FAILURE);
}
int ft_printf(const char *format, ...)
{
    va_list ap;
    char    *tmp;
    int32_t sp_type;
    tmp = format;
    va_start(ap, format);
    while (tmp != '')
    {
        if (tmp != '%')
        {
            ft_putchar(tmp);
            continue;
        }
        if ((sp_type = is_sp_integer(++tmp)) != FAILURE)
            ;   //parse_flag(sp_type);
        //continue checking the type of the specifier
    }
    va_end(ap);
    return (SUCCESS);
}

我要避免的东西:

这些只是裸露的原型,但是我想知道是否有适当的方法使我的功能如此清洁。我认为,这意味着如果可能的话,我想避免进行这样的检查:

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 != '')
  {
    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)
        ''
    };
    uint32_t    i;
    while (g_sp_integer[i] != '')
    {
        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);
}

相关内容

  • 没有找到相关文章