1

我必须检查环境变量是否存在以及它是否是整数值。我有这个代码:

char *aux;
aux=getenv("MAX_OUTPUT");
if (aux==NULL || !(isInteger(aux))){
/*code*/
}

我检测何时未使用 aux==NULL 定义它,以及它是否不是具有我定义的函数的整数(isInteger)。那行得通,问题是当变量存在但设置为空字符串时。有任何想法吗?提前致谢

4

4 回答 4

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行为合理,则为任何看起来像整数的字符串返回真结果,而为任何不是整数的字符串返回假结果(对于空指针或不指向有效字符串的指针可能具有未定义的行为),然后这个:

if (aux == NULL || !isInteger(aux)) {
    /* it's not an integer */
}

应该足够了。

于 2013-11-13T16:42:33.253 回答
0

如果isInteger()没有说false空字符串,我会犹豫声称它有效。当然,如果没有isInteger()包含的代码,很难更具体。

我认为像这样的函数bool isInteger(const char *str)必须false同时返回NULL一个空字符串,所以aux == NULL甚至不需要测试。

于 2013-11-13T16:33:14.023 回答
0
if (aux == NULL || (!isInteger(aux) || !*aux)) {

像那样 ?*aux 测试字符串是否为空

于 2013-11-13T16:41:18.097 回答
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()

于 2013-11-13T16:43:36.447 回答