Здравствуйте, 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;
}