Не удается разобрать подстроку между |символы в C - PullRequest
0 голосов
/ 14 октября 2019

У меня есть строка, которая содержит информацию, разделенную |символы, и мне нужно создать подстроки для каждой части информации. Кроме того, некоторые поля могут быть пустыми.

Порядок значений: FirstName | LastName | Age | IDNumber | Рост | Вес

Таким образом, возможные строки могут быть:

char * strA = "Джон | Доу | 50 | 123456 | 70 | 150";char * strB = "James | Smith | 40 | 345678 ||";

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

Чтобы получить первое значение, я могу вызвать

char* strA = "John|Doe|50|123456|70|150";
char* a, b;
sscanf(strA, "%[^|]|", &a);
printf("%s\n", &a);

, который печатает John Но когда я пытаюсь получить первые 2 поля, вызвав

char* strA = "John|Doe|50|123456|70|150";
char* a, b;
sscanf(strA, "%[^|]|%[^|]|", &a, &b);
printf("%s | %s\n", &a, &b);

Он печатает oe | Doe

Я не могу понять, почему это так.

1 Ответ

0 голосов
/ 14 октября 2019

Ваш указатель неверен. Либо используйте динамическое или автоматическое распределение. Кроме того, ваши аргументы sscanf для формата %[^|] также неверны. Это предполагает char* и вашу доставку char** в случае &a и простой указатель на char (один) в случае &b. Обе должны ссылаться на объем памяти, достаточный для потребления вашего ввода.

Пример (с использованием автоматического хранения)

const char* strA = "John|Doe|50|123456|70|150";
char a[32], b[32];
sscanf(strA, "%31[^|]|%31[^|]|", a, b);
printf("%s | %s\n", a, b);

Честно говоря, почти любой современныйЦенность цепочки инструментов должна была предупредить вас о неправильных типах, отправляемых на scanf и printf. Включите ваши предупреждения и / или используйте набор инструментов, разработанный в этом тысячелетии.

...