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