1

環境変数が存在するかどうか、およびそれが整数値であるかどうかを確認する必要があります。私はこのコードを持っています:

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

aux==NULL で定義されていない場合と、定義した関数 (isInteger) を持つ整数でない場合を検出します。問題は、変数が存在するが空の文字列に設定されている場合です。何か案は?前もって感謝します

4

4 に答える 4

2

の動作はisInteger、すべての入力に対して定義する (または明示的に未定義にする) 必要があります。isInteger(NULL)呼び出し元が有効な文字列ポインターを渡す必要があるため、未定義の動作をそのままにしておくことは不合理ではありません。

巻き戻しの答えが示唆するように、isIntegerおそらく空の文字列に対して false (0) を返す必要があります。

ただし、空の文字列を自分で確認したい場合は、長さが 0 かどうかを確認できます。

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

または、同等に、文字列の最初 (0 番目) の文字が終端の null'\0'文字かどうかを確認できます。

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

*auxのように書くこともできますaux[0]

auxこれは、たとえば単一の空白を含むかどうかをチェックしないことに注意してください: " "、しかし、isIntegerおそらくそれを処理する必要があります。

それが合理的に動作すると仮定するとisInteger、整数のように見える文字列に対して真の結果を返し、そうでない文字列に対して偽の結果を返します (おそらく、null ポインターまたは有効な文字列を指していないポインターの未定義の動作で) )、次にこれ:

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

十分なはずです。

于 2013-11-13T16:42:33.253 に答える
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 に答える
0

isInteger()空の文字列について言わない場合false、それが機能すると主張することを躊躇します。もちろん、isInteger()included のコードがなければ、より具体的にすることは困難です。

のような関数は両方と空の文字列をbool isInteger(const char *str)返す必要があると思うので、テストは必要ありません。falseNULLaux == NULL

于 2013-11-13T16:33:14.023 に答える