Строка формата sscanf, которая может обнаружить дефисную и не дефисную строку - PullRequest
0 голосов
/ 07 ноября 2018

Я работаю над реализацией, которая использует sscanf () для обнаружения ввода. Ввод будет содержать дефис «-» или не будет. Длина строк и положение дефиса будут различаться. Примеры:

"18509726-550"
"14782"

Я пытался придумать строку формата, которая возвращает> 0 для строк с дефисом, но не для строк без дефиса, однако я не добился успеха. Это может быть невозможно. Я также понимаю, что есть гораздо лучшие способы добиться этого, но этот код был написан задолго до моего времени.

Код:

// what format string will return 0 for one but not the other?
String^ pszString = "18509726-550"; // or "14782"
int nP;
char buffer[256];
char buffer1[256];
const char* pSrc = (gcnew marshal_context())->marshal_as<const char*>(pszString);
nP=sscanf(pSrc, "%[-]s", buffer, buffer1);

Я пробовал несколько строк формата:

"%s-%s"
"%[0-9-]s"
"%[-]s"
"%[^-]s"

Я изучил любую документацию по sscanf, которую смог найти, и не думаю, что это возможно только с sscanf, но проверка также помогает. Спасибо ТАК сообщество!

1 Ответ

0 голосов
/ 07 ноября 2018

[] предполагает формат s уже. Просто используйте "%[^-]-%[^-]".

#include <stdio.h>

void test(const char* s)
{
    char s1[100]{}, s2[100]{};
    int n = sscanf(s, "%[^-]-%[^-]", s1, s2);
    printf("%d: %s, %s\n", n, s1, s2);
}

int main()
{
    test("18509726-550");
    test("14782");
}

Печать:

2: 18509726, 550
1: 14782, 
...