我必须检查环境变量是否存在以及它是否是整数值。我有这个代码:
char *aux;
aux=getenv("MAX_OUTPUT");
if (aux==NULL || !(isInteger(aux))){
/*code*/
}
我检测何时未使用 aux==NULL 定义它,以及它是否不是具有我定义的函数的整数(isInteger)。那行得通,问题是当变量存在但设置为空字符串时。有任何想法吗?提前致谢
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行为合理,则为任何看起来像整数的字符串返回真结果,而为任何不是整数的字符串返回假结果(对于空指针或不指向有效字符串的指针可能具有未定义的行为),然后这个:
if (aux == NULL || !isInteger(aux)) {
/* it's not an integer */
}
应该足够了。
如果isInteger()没有说false空字符串,我会犹豫声称它有效。当然,如果没有isInteger()包含的代码,很难更具体。
我认为像这样的函数bool isInteger(const char *str)必须false同时返回NULL一个空字符串,所以aux == NULL甚至不需要测试。
if (aux == NULL || (!isInteger(aux) || !*aux)) {
像那样 ?*aux 测试字符串是否为空
如果验证后aux不为NULL,可以不用C函数isdigit()检查第一个元素aux吗?
if(isdigit(aux[0]){...}
或者:
char *aux;
aux=getenv("MAX_OUTPUT");
if (aux!=NULL)
{
if(!isdigit(aux[0]))
{
/*code*/
}
}
(假设您不需要使用isInteger())