1

C で単純な可変引数リスト関数を 1 つ作成しましたが、機能しません。その関数を 1 つの引数で呼び出し、その関数内でその引数をチェックすると、その引数の値が失われました。たとえば、次のコードでは、「format」の値を確認すると、常に NULL のままです。つまり、常に「format is NULL」と表示されます。デバッグ メッセージで。この原因の可能性を教えてください。

Calling the function:    lcdPrintf( "Change" );

int lcdPrintf( char * format, ... ) 
{
    if ( *format ) {
        printf("format is not NULL.\r\n");
    }
    else {
        printf("format is NULL.\r\n");
    }

     return -1;
}
4

3 に答える 3

1

if ( *format )を使用するときに format が指す最初の文字の値をテストしていif ( format )ます。ポインターの有効性を確認する場合に使用します。しかし、あなたが書いた呼び出しでは、とにかく動作するはずです。

可変引数をstdarg.h使用するには、マクロを使用し、それを操作するva_start必要va_argがありますva_end

可変引数の処理では、使用している各引数の型を知る必要があります。そこで、printf でフォーマット文字列が役立ちます。各引数にはいくつかのタイプ ( %sis a char *、 is an integer) があり、マクロが次の引数値を取得するために読み取る必要があるバイト数を知るの%dに役立ちます。va_arg

va_args の使用の簡単な例を次に示します。

#include <stdarg.h>

void printIntegers(int count, ...)
{
    va_list ap;
    int i;

    va_start(ap, count);
    for (i = 0; i < count; i++) {
        int v = va_arg(ap, int);

        printf("%d\n", v);
    }
    va_end(ap);                      
}

int main()
{
    printIntegers(2, 12, 42);
}
于 2012-10-23T22:08:03.747 に答える
0

この原因の可能性を教えてください。

コードにエラーが含まれているため、フォーマット文字列の最初の文字を確認する必要があります。この場合は「C」(「変更」) です。

したがって、 1 つの可能性あります。渡されたフォーマット文字列の最初の文字が 0 である、つまり空である可能性があります。

#include <stdio.h>

int lcdPrintf( char * format, ... )
{
    /* if you want to check whether format is null, the test ought to be */
    /* if (format) ..., not if (*format) ... */

    if ( *format ) {
        printf("format is not NULL.\r\n");
    }
    else {
        printf("format is NULL.\r\n");
    }
    return 0;
}

int main(void)
{
        lcdPrintf("");
        return 0;
}

これは「フォーマットはNULLです」を返します。あなたが指定したようにそのコードを呼び出す場合、他に方法はありません(そうしなかった場合、すべての賭けは無効になります:-))

于 2012-10-23T22:11:20.087 に答える
0

以下のコードを使用して関数をテストしましたが、動作しているようです。コード内の別の場所から問題が発生している可能性はありますか?

#include <stdio.h>

int lcdPrintf( char * format, ... ) 
{
    if ( *format ) {
        printf("format is not NULL.\r\n");
    }
    else {
        printf("format is NULL.\r\n");
    }   
    return 1;
}

int main(){ 
    lcdPrintf("Test"); // Prints "format is not NULL."  
    return (0);
}
于 2012-10-23T22:09:17.933 に答える