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功能会理解它,尽管我自己无法验证。这是工作程序(稍作修改)。


Daniel Fischer 提醒我注意sscanf_ssprintf_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 回答