Хобрук: Ваш путь к мастерству в программировании

sscanf использует @ в качестве разделителя

Используя «@» в качестве разделителя в sscanf, я не получаю ожидаемого результата.

Пример:

#include <stdio.h>
int main()
{
        char buf[512], scan_buf1[512], scan_buf2[512];
        sprintf(buf, "abc@def");
        sscanf(buf, "%s@%s", scan_buf1, scan_buf2);
        printf("Scanned buffer1 - %s scan buffer2 - %s\n", scan_buf1, scan_buf2);
}

Expected op:
Scanned buffer1 - abc scan buffer2 - def

Actual op:
Scanned buffer1 - abc@def scan buffer2 -

Должен ли я использовать какой-то специальный синтаксис для "@"? Я не мог ничего увидеть для этого на странице руководства.

01.08.2014

  • Проблема не связана с символом at (@). Это может случиться с чем угодно, потому что scanf вместо %s читает целую строку. Тогда не остается строки для чтения, чтобы соответствовать @%s или чему-либо еще в строке формата. 01.08.2014
  • sscanf() ожидает пробелы в качестве разделителей. Но вы можете использовать strtok() для разбора этой строки. 01.08.2014
  • попробуйте "%[^@]@%s"или используйте strchr(buf, '@') и разделите. 01.08.2014

Ответы:


1

Если вы прочитаете эту scanf (и семейную) справку, вы увидите, что формат "%s" читает

последовательность непробельных символов

Это означает, что "%s" будет читать символы, пока не достигнет пробела. Поскольку в вашем вводе нет пробела, он будет считывать все в первую строку.

Вы можете решить эту проблему, используя формат "%[":

sscanf(buf, "%[^@]@%s", scan_buf1, scan_buf2);
01.08.2014
  • Привет, это работает. Спасибо. BDW - это strtok, как было предложено в одном из комментариев, лучший вариант здесь? 01.08.2014
  • @Manty Вам нужно больше кода для работы с strtok, поэтому я бы рекомендуем использовать sscanf в вашем случае. 01.08.2014
  • Интересный ответ не предлагал "%[^@]@%[^@]" для симметрии и не советовал проверять возвращаемое значение sscanf(). 01.08.2014
  • Новые материалы

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

    «Очень простой» эволюционный подход к обучению с подкреплением
    В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..