Формат scanf, чтобы игнорировать нерелевантные символы

Я написал короткий пример кода, чтобы проиллюстрировать мою проблему

#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 это соответствует этому примеру и объяснить, как туда добраться.

1 ответ

Решение

Вы можете использовать следующий формат:

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

%*[^/] говорит scanf игнорировать все, что не является /, Я полагаю, ваш sscanf_s Функция поймет это, хотя я сам не могу это проверить. Вот рабочая программа (слегка измененная).


Даниэль Фишер обратил мое внимание на то, что sscanf_s а также sprintf_s функции определены в Приложении K стандарта C 2011 года (C11). Я поднял вопрос о его отношении к соответствию.


Знаю это "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;
Другие вопросы по тегам