2013-05-22 3 views
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, который соответствует этому примеру и объясняет, как туда добраться.

+1

Я предполагаю, что «ненужным» персонажем является все, что не в 'ожидать'. Как насчет функции, которая создает новую строку, которая удаляет все ненужные символы из 'inStr'? Затем вы вызываете scanf в новую строку. – user2233706

+0

@ пользователь2233706 ваше предположение верно. Мне нужно проверить содержимое и прочитать его несколько раз. Это будет частью очень ограниченного математического анализатора, который должен построить и отличить известный набор типов функций. Я позже опишу некоторые символы, чтобы помочь мне проверить, что у меня есть правильная функция. Функциональный формат всегда является пробелом + "+ functiondata +" + whitespace. – Johannes

ответ

6

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

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

%*[^/] говорит scanf игнорировать все, что не является /. Я предполагаю, что ваша функция sscanf_s поймет это, хотя я не могу проверить это сам. Here's the working program (slightly modified).


Даниэль Фишер обратил мое внимание, что sscanf_s и sprintf_s функции определены в Приложении K из C Standard 2011 (С11). I raised a question about its relation to conformance.


Зная, что "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; 
+2

Те, которые кажутся (необязательными) функциями из приложения К стандарта. (например, glibc не реализует их [пока?], поэтому они не совсем переносимы.) Если они есть, они понимают те же форматы, что и версии '_s'-less. –

+1

@ DanielFischer: Спасибо за информацию. – jxh

+0

+1 Для вашего ответа, thx. Я попробую это завтра и соглашусь позже. Зная, что «X /» «в строке важна для меня. Также зная, что после этого нет ничего другого. Я предполагаю, что ваш ответ заставит меня начать здесь. – Johannes

Смежные вопросы