У меня есть строка (45 байт):
String1 String2000000000001234
Мне нужно получить три переменные из этой строки:
char * var1="String1";
char * var2="String2";
int var3=1234;
Здесь 3 части с фиксированной длиной (15 байт). Мне нужно сохранить все части в переменную без пробелов для строк и без нуля для целых чисел.
Это возможно с scanf ()? Как я могу это сделать?
Невозможно с sscanf. Во-первых, вам нужно передать символ массив (и размер, если вы используете разнообразие _s), а не просто указатель на символ (т. е. с ним должна быть связана память). Во-вторых, строки в sscanf оканчиваются пробелами, и у вас нет строк между String2 и 0000. Напишите собственный анализатор для этого формата.
В соответствии с этот, Ваша проблема должна быть решена в следующем формате:
%*[^a-zA-Z]%s%*[^a-zA-Z]%[^0]s%*[^1-9]%d
Описание:
% * [^ a-zA-Z] — пропустить (не сохранять) до алфавита, то есть пропустить начальные пробелы
% s — читать первую строку до пробелов
% * [^ a-zA-Z] — пропустить завершающие пробелы до следующей строки
% [^ 0] s — чтение строк с использованием нулей
% * [^ 1-9] — пропустить до ненулевых цифр
% d — наконец, прочитайте число
Самый простой, вероятно, будет:
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, чтобы убедиться, что входная строка корректна.