Параметр формата sscanf не работает
Пользователь вводит строку в указанном формате
K i v
К это строка
я инт
V является инт
Пример: "К 100 2"
char char_cmd = K
int a = 100
int b = 2
cout << "Input your command to perfrom operation: " << endl
cin >> input;
sscanf(input.c_str(),"%s %d %d",&char_cmd,&a,&b);
Я получаю значение для char_cmd без проблем. Когда дело доходит до целых a & b, кажется, что он не копирует то, что вводит пользователь
Я посмотрел вокруг, и кажется, что пробелы являются проблемой
Что я могу сделать, чтобы достичь этого?
2 ответа
char char_cmd;
int a;
int b;
char input[100];
cin.getline(input,sizeof(input));
sscanf(input,"%c %d %d",&char_cmd,&a,&b);
Решение:
отбрасывать
cin >> input;
sscanf(input.c_str(),"%s %d %d",&char_cmd,&a,&b);
и заменить его на
cin >> char_cmd >>a >> b;
Почему то, что ОП здесь не сработает:
Проблема 1:
cin >> input;
читает ровно один пробел с разделителями. Для данного примера ввода OP, "K 100 2", вход содержит "K". Это все. Заглянуть в std::getline
читать более одного слова за раз.
Проблема 2:
В
sscanf(input.c_str(),"%s %d %d",&char_cmd,&a,&b);
sscanf
было поручено
%s
разобрать строку с пробелом и сохранить ее вchar_cmd
%d
проанализировать целое число со знаком и сохранить его вa
%d
проанализировать целое число со знаком и сохранить его вb
ОП только что уточнил в своих комментариях, что char_cmd
это char
, а не буфер, способный содержать строку с нулевым символом в конце. Чтение столько, сколько один персонаж займет два char
s, один для прочитанного символа и один для нулевого. Неопределенные результаты поведения.
Потому что указатель на массив char
и указатель на char
выглядят точно так же, sscanf
не может обнаружить ошибку. На самом деле, потому что sscanf
принимает переменные аргументы, он не может обнаружить много ошибок. Это причина номер один, чтобы не использовать его.