4

問題を説明するために短いサンプルコードを書きました

#include <stdio.h>
#include <string.h>

unsigned parseAndCompareDouble(const char* inSTR, const char* inF, const char * expect, const char * outF){
    unsigned e = 0;
    char buffer[2000];
    double a = 0;
    if( 1 != sscanf_s( inSTR, inF, &a, sizeof(double) ) ) e += 1;
    if( (int) strlen(expect) != sprintf_s(buffer, 2000, outF, a) ) e += 1;
    if( 0 != strcmp(expect, buffer) ) e += 1;
    return e;
}

unsigned main( void )
{
    unsigned e = 0;
    const char * universalFormat = "X/%lf";

    e += parseAndCompareDouble("X/100", universalFormat, "X/100", "X/%3.0lf");
    e += parseAndCompareDouble("     X/100\r\n", universalFormat, "X/100", "X/%3.0lf");
    e += parseAndCompareDouble("     X/99\r\n", universalFormat, "X/99", "X/%2.0lf");
    e += parseAndCompareDouble("     X / 99 ", universalFormat, "X/99", "X/%2.0lf");
    e += parseAndCompareDouble("X/99", universalFormat, "X/99", "X/%2.0lf");
    e += parseAndCompareDouble("     \"X/100\"\r\n", universalFormat, "X/100", "X/%3.0lf");  

    if( 0 != e ){ printf( "%2u errors occured\n", e ); }
    else{ printf( "all pass\n", e ); }
    return e;
}

universalFormatサンプル フィクスチャがテストに合格できるを探しています。いじって%*sみましたが、うまくいきません。私はいくつかの概念がありません。

universalFormat誰かがこの例に合った を提供し、そこにたどり着く方法を説明できますか?

4

1 に答える 1

6

次の形式を使用できます。

const char * universalFormat = "%*[^/]/%lf";

ではないものはすべて無視するように%*[^/]指示します。自分で確認することはできませんが、関数がそれを理解すると想定しています。これが作業プログラムです(わずかに変更されています)。scanf/sscanf_s


sscanf_sDaniel Fischer は、 関数とsprintf_s関数が C 標準 2011 (C11) の附属書 K で定義されていることに注意を促しました。適合性との関係について質問しました。


それが文字列にあることを知ること"X /"は、私にとって重要です。

sscanf自由形式の入力を解析するために使用しようとしているようですが、これは実際には得意ではありません。解析コードを変更する場合は、書式文字列の変更バージョンを使用してこれを実現できます。

const char * universalFormat = "%[^/]/%lf";

ここで、指定子に対応する文字列を読み取るように解析コードを更新する必要があります。次に、%[^/]簡単なスキャンを実行して、要件を満たしていることを確認します。

char xbuffer[2000];
const char *xp;
/*...*/
if( 2 != sscanf_s( inSTR, inF, xbuffer, sizeof(xbuffer), &a, sizeof(a) ) ) e += 1;
if( (xp = strrchr(xbuffer, 'X')) == 0 || strcspn(xp, "X \t") != 0 ) e += 1;
于 2013-05-22T16:37:27.043 に答える