我必须检查环境变量是否存在以及它是否为整数值。我有这段代码:
char *aux;
aux=getenv("MAX_OUTPUT");
if (aux==NULL || !(isInteger(aux))){
/*code*/
}
我检测到它没有用aux == NULL定义,如果它不是带有我定义的函数的整数(isInteger)。这是有效的,问题是变量存在但是设置为空字符串。有任何想法吗?提前致谢
答案 0 :(得分:2)
应为任何输入定义(或显式未定义)isInteger
的行为。保持isInteger(NULL)
的行为未定义,要求调用者传递有效的字符串指针是不合理的。
正如unwind的回答所示,isInteger
应该为空字符串返回false(0)。
但是如果你想自己检查一个空字符串,可以检查长度为0:
char *aux;
aux=getenv("MAX_OUTPUT");
if (aux==NULL || strlen(aux) == 0 || !(isInteger(aux))){
/*code*/
}
或者,等效地,您可以检查字符串的第一个(第0个)字符是否是终止的空'\0'
字符:
char *aux;
aux=getenv("MAX_OUTPUT");
if (aux==NULL || *aux == '\0' || !(isInteger(aux))){
/*code*/
}
*aux
也可以写为aux[0]
。
请注意,这不会检查,例如,aux
包含一个空格:" "
,但isInteger
可能应该再次处理。
假设isInteger
行为合理,为任何看起来像整数的字符串返回true结果,对任何没有的字符串返回false结果(并且可能对空指针或指针的未定义行为返回不指向有效的字符串),然后这个:
if (aux == NULL || !isInteger(aux)) {
/* it's not an integer */
}
应该足够了。
答案 1 :(得分:0)
如果isInteger()
没有说false
为空字符串,我会毫不犹豫地宣称它有效。当然,如果不包含isInteger()
的代码,则很难更具体。
我认为像bool isInteger(const char *str)
这样的函数必须为false
和空字符串返回NULL
,因此甚至不需要aux == NULL
测试。
答案 2 :(得分:0)
if (aux == NULL || (!isInteger(aux) || !*aux)) {
那样的? *如果字符串为空则进行辅助测试
答案 3 :(得分:0)
如果在验证aux
不是NULL后,您是否可以使用C函数isdigit()
来检查aux
的第一个元素?
if(isdigit(aux[0]){...}
或:
char *aux;
aux=getenv("MAX_OUTPUT");
if (aux!=NULL)
{
if(!isdigit(aux[0]))
{
/*code*/
}
}
(假设您不需要使用isInteger()
)