Re[3]: форматированный ввода. scanf или что-то другое?
От: korzhik Россия  
Дата: 21.03.13 09:57
Оценка:
Здравствуйте, vandi711, Вы писали:

V>Долгими мурыжаньями у меня получилась регуляярка вида .*?(?=\s\d)

V>Но вот, если писать:

V>
V>scanf("%[.*?(?=\s\d)]%d", str, &digit)
V>


Очень оптимистично было регулярку в scanf засунуть -)
Читай доки: http://pubs.opengroup.org/onlinepubs/009695399/functions/scanf.html

Можно конечно и scanf'ом такое сделать.
Вот код для первой типа строк:

bool parse(const char* str, int* term_width, int* value)
{
    if (!str || !*str || !term_width || !value) return false;

    const char* p = str;
    
    // skip leading white-spaces
    while (std::isspace(*p)) ++p;

    int n = p - str;
    int result = std::sscanf(p, "%*s%n%d", term_width, value);

    if (result != 1 || result == EOF)
        return false;

    *term_width += n;
    return true;
}

int main()
{
    int v,w;
    assert(!parse(0,0,0));
    assert(!parse("",0,0));
    assert(!parse(0,&w,&v));
    assert(!parse("",&w,&v));
    assert(!parse("p",&w,&v));
    assert(!parse(" 1",&w,&v));
    {
        const char* str = "p 1";
        assert(parse(str, &w, &v));
        std::string s(str, w);
        assert(s == "p");
        assert(v == 1);
    }
    {
        const char* str = "root 1";
        assert(parse(str, &w, &v));
        std::string s(str, w);
        assert(s == "root");
        assert(v == 1);
    }
    {
        const char* str = "  root/folder 5";
        assert(parse(str, &w, &v));
        std::string s(str, w);
        assert(s == "  root/folder");
        assert(v == 5);
    }
    {
        const char* str = "    root/folder/example1000 10";
        assert(parse(str, &w, &v));
        std::string s(str, w);
        assert(s == "    root/folder/example1000");
        assert(v == 10);
    }
    return 0;
}


для второго типа как то так:

#include <vector>

int main()
{
    const char* str = "1 2 13 40 5";
    const char* p = str;
    std::vector<int> arr;

    int value, n;
    while (sscanf(p, "%d%n", &value, &n) != EOF)
    {
        arr.push_back(value);
        p += n;
    }
    return 0;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.