C игнорировать тире в scanf

#c #scanf

#c #scanf

Вопрос:

Я пытаюсь загрузить два значения из строки, разделенной символом » — «.
Я не могу понять, что поместить в scanf, чтобы игнорировать это тире.

Вот упрощенный фрагмент, который иллюстрирует проблему:

 char first[3];
char second[3];

char* str = "foo - bar";
sscanf(str, "%s <what should be here> %s", first, second);

printf("%s %s", first, second);
 

Если в заполнитель ничего не помещено, программа печатает «foo -»

Ответ №1:

Чтобы указать scanf ожидаемое значение a - , поместите a - в строку формата:

 sscanf(str, "%s - %s", first, second);
 

Кроме того, сделайте свои массивы достаточно большими, чтобы содержать ожидаемые символы плюс завершающий нулевой символ:

 char first[4];
char second[4];
 

Вы также должны ограничить scanf размер принимающих массивов:

 sscanf(str, "%3s - %3s", first, second);
 

Если - может отсутствовать, вам нужен дополнительный код для обработки этого; простого scanf недостаточно. Аналогично, если строки могут быть длиннее трех символов, вам потребуется дополнительный код.

Комментарии:

1. Тестирование возвращаемого значения sscanf() кажется рекомендуемым, или массивы должны быть инициализированы как пустые строки.

2. Я попытался вставить » — » между ними, но не получил правильного ответа, неудивительно, что массивы символов слишком короткие. Спасибо.

3. Убедитесь, что это на самом деле '-' (дефис), а не '–' (тире) (и есть 3-й вариант, имя которого ускользает от меня сейчас)

4. @DavidC.Rankin: дефис, короткое тире, тире, цифровая черточка, горизонтальная полоса и горизонтальная развертка — строка 7, по крайней мере.

5.@EricPostpischil — я исправлен. Эти причудливые настройки набора текста намного выше моего уровня оплаты за обработку текста. Я думал о тире en, и я знаю горизонтальную полосу, но цифровая черточка и горизонтальная линия сканирования являются новыми для моего языка. короткое тире. (хороший день — добавлено к нему, теперь для поиска :) тире и дефисов: полное руководство