4

我的数据库提供了一个文本文件,其中包含打开和关闭"分隔符公式。这组公式非常有限,一旦确定就很容易实现。我尝试使用 scanf 来获取参数,并且我想使用分隔符"来提供 scanf 失败的机制。

在下面的示例中,最后一个分隔符被忽略,并且找不到分隔符的信息丢失。我如何控制 sscanf 是否能够匹配整个字符串?

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

unsigned printIdentity(const char * formula){
    unsigned e = 0, found = 0;
    double a, b;
    printf("-------------\n");
    printf("INVESTIGATING: %s\n", formula);
    if( ( 2 == sscanf_s( formula, " \" X * %lf %lf \" ", &a, &b, sizeof( double ), sizeof( double ) ) ) ){
        printf("MATCH: X * %lf + %lf\n", a, b);
        ++found;
    }
    if( ( 1 == sscanf_s( formula, " \" X * %lf \" ", &a, sizeof( double ) ) ) ){
        printf("MATCH: X * %lf\n", a);
        ++found;
    }
    if( found != 1){
        e += 1;
        printf("ERROR: %u formula types\n", found);
    }
    printf("-------------\n");
    return e;
}

unsigned main( void )
{
    unsigned e = 0;

    e += printIdentity("     \"X*3.1\"");
    e += printIdentity("     \"X*3.2-4.2\"");
    e += printIdentity("     \"X*3.3+4.3\"");

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

1 回答 1

6

我如何控制 sscanf 是否能够匹配整个字符串?

使用格式说明符%n获取处理结束的位置并与输入字符串的长度进行比较,其中n格式说明符定义为(来自第7.19.6.2节C99 标准的 fscanf 函数):

不消耗任何输入。相应的参数应该是一个指向有符号整数的指针,将通过调用 fscanf 函数从输入流中读取的字符数写入该整数。执行 %n 指令不会增加 fscanf 函数执行完成时返回的赋值计数。没有参数被转换,但有一个被消耗。如果转换规范包括分配抑制字符或字段宽度,则行为未定义。

例如:

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

int main()
{
    const char* good_input = "\"20 21\"";
    const char* bad_input = "\"14 12";
    int a[2];
    int pos;

    if (sscanf(good_input, " \"%d %d\"%n", &a[0], &a[1], &pos) == 2 &&
        pos == strlen(good_input))
    {
        printf("good_input: %d %d\n", a[0], a[1]);
    }

    if (sscanf(bad_input, " \"%d %d\"%n", &a[0], &a[1], &pos) == 2 &&
        pos == strlen(bad_input))
    {
        printf("bad_input: %d %d\n", a[0], a[1]);
    }
}

输出:

好输入:20 21

http://codepad.org/6G4lLXWg上的在线演示。

于 2013-05-23T11:37:21.210 回答