我有一个在我学校重新创建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);
}