Как разобрать строку с помощью sscanf_s ()?

У меня есть строка (45 байт):

        String1        String2000000000001234

Мне нужно получить три переменные из этой строки:

char * var1="String1";
char * var2="String2";
int var3=1234;

Здесь 3 части с фиксированной длиной (15 байт). Мне нужно сохранить все части в переменную без пробелов для строк и без нуля для целых чисел.

Это возможно с scanf ()? Как я могу это сделать?

3

Решение

Невозможно с sscanf. Во-первых, вам нужно передать символ массив (и размер, если вы используете разнообразие _s), а не просто указатель на символ (т. е. с ним должна быть связана память). Во-вторых, строки в sscanf оканчиваются пробелами, и у вас нет строк между String2 и 0000. Напишите собственный анализатор для этого формата.

4

Другие решения

В соответствии с этот, Ваша проблема должна быть решена в следующем формате:

%*[^a-zA-Z]%s%*[^a-zA-Z]%[^0]s%*[^1-9]%d

Описание:

% * [^ a-zA-Z] — пропустить (не сохранять) до алфавита, то есть пропустить начальные пробелы

% s — читать первую строку до пробелов

% * [^ a-zA-Z] — пропустить завершающие пробелы до следующей строки

% [^ 0] s — чтение строк с использованием нулей

% * [^ 1-9] — пропустить до ненулевых цифр

% d — наконец, прочитайте число

3

Самый простой, вероятно, будет:

char var1_buffer[31] = "", var2_buffer[31] = "";
sscanf(string+30, "%d", &var3);
string[30] = '\0';
sscanf(string, "%s%s", var1_buffer, var2_buffer);
var1 = strdup(var1_buffer);
var2 = strdup(var2_buffer);

который требует возможности записи во входную строку. Если это невозможно, вы можете заменить строки 3 и 4 на:

int p1 = 0;
sscanf(string, "%30s %n%30s", var1_buffer, &p1, var2_buffer);
if (p1 > 30)
p1 = 30;
var2_buffer[30-p1] = '\0';

В любом случае вам, вероятно, следует добавить проверки возвращаемого значения sscanf, чтобы убедиться, что входная строка корректна.

0
По вопросам рекламы [email protected]