#include <iostream>
#include <iterator>
#include <vector>
#include <regex>
std:: vector < int > parse( const std:: string & iStr) {
std:: vector < int > Ret;
std:: vector < std:: string > Tmp;
std:: string Work( iStr) ;
Work.erase ( 0 ,Work.find_first_not_of ( ' ' ) ) ;
Work.erase ( Work.find_last_not_of ( ' ' ) + 1 ) ;
if ( Work.length ( ) == 0 ) throw std:: invalid_argument ( "Пустая строка" ) ;
if ( Work[ 0 ] == ',' ) throw std:: invalid_argument ( "В первой позиции не число" ) ;
if ( Work[ Work.length ( ) - 1 ] == ',' ) throw std:: invalid_argument ( "В последней позиции не число" ) ;
std:: regex Rx( "\\ s*,\\ s*" ) ;
std:: sregex_token_iterator Begin( Work.begin ( ) , Work.end ( ) , Rx, - 1 ) ;
std:: sregex_token_iterator End;
while ( Begin ! = End) Tmp.push_back ( ( Begin++ ) - > str( ) ) ;
Rx = "^\\ s*((\\ +|-)?[0-9]+)\\ s*,?\\ s*$" ;
int Pos = 0 ;
for ( const auto & i: Tmp) {
std:: smatch Match;
std:: regex_search ( i, Match, Rx) ;
if ( Match.size ( ) == 3 )
try {
Ret.push_back ( std:: stoi ( Match.str ( 1 ) ,nullptr,10 ) ) ;
} catch ( ...) {
throw std:: invalid_argument ( "В позиции " + std:: to_string ( Pos) + " слишком длинное число" ) ;
}
else throw std:: invalid_argument ( "В позиции " + std:: to_string ( Pos) + " не число" ) ;
Pos++ ;
}
return Ret;
}
int main( ) {
for ( const auto & i: {
"1, 4, 5, -6, -8 , 3, 1" ,
"1, 3333333333333333333333333334, 5, -6, -8 , 3, 1" ,
" 5 , 6, 57, +68 , 18, 32, 4 " ,
"77" ,
"" ,
" " ,
"1, 4, 5, 6, 8, 3, 1," ,
" , 6, 57, 68 , 18, 32, 4" ,
"5, 6, , 68, 18, 32, 4" ,
"5, 6,, 68, 18, 32, 4" ,
"5, 6, T, 68, 18, 32, 4" ,
"5, 6, 34T, 68, 18, 32, 4" ,
"5, 6, 34 55, 68, 18, 32, 4" ,
"," ,
",," ,
",, ,, ,,," } ) {
try {
std:: cout << "\" " << i << "\" : " ;
parse( i) ;
std:: cout << "Ok" ;
} catch ( std:: invalid_argument & E) {
std:: cout << E.what ( ) ;
}
std:: cout << std:: endl ;
}
return 0 ;
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgICNpbmNsdWRlIDxpdGVyYXRvcj4KICAgICNpbmNsdWRlIDx2ZWN0b3I+CiAgICAjaW5jbHVkZSA8cmVnZXg+CiAgICAgCiAgICBzdGQ6OnZlY3RvcjxpbnQ+IHBhcnNlKGNvbnN0IHN0ZDo6c3RyaW5nICZpU3RyKSB7CiAgICAgIHN0ZDo6dmVjdG9yPGludD4gUmV0OwogICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gVG1wOyAKICAgICAgc3RkOjpzdHJpbmcgV29yayhpU3RyKTsKICAgICAgV29yay5lcmFzZSgwLFdvcmsuZmluZF9maXJzdF9ub3Rfb2YoJyAnKSk7CiAgICAgIFdvcmsuZXJhc2UoV29yay5maW5kX2xhc3Rfbm90X29mKCcgJykrMSk7IAogICAgICBpZiAoV29yay5sZW5ndGgoKSA9PSAwKSB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoItCf0YPRgdGC0LDRjyDRgdGC0YDQvtC60LAiKTsKICAgICAgaWYgKFdvcmtbMF0gPT0gJywnKSB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoItCSINC/0LXRgNCy0L7QuSDQv9C+0LfQuNGG0LjQuCDQvdC1INGH0LjRgdC70L4iKTsKICAgICAgaWYgKFdvcmtbV29yay5sZW5ndGgoKS0xXSA9PSAnLCcpIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgi0JIg0L/QvtGB0LvQtdC00L3QtdC5INC/0L7Qt9C40YbQuNC4INC90LUg0YfQuNGB0LvQviIpOyAgCiAgICAgIHN0ZDo6cmVnZXggUngoIlxccyosXFxzKiIpOwogICAgICBzdGQ6OnNyZWdleF90b2tlbl9pdGVyYXRvciBCZWdpbihXb3JrLmJlZ2luKCksIFdvcmsuZW5kKCksIFJ4LCAtMSk7CiAgICAgIHN0ZDo6c3JlZ2V4X3Rva2VuX2l0ZXJhdG9yIEVuZDsKICAgICAgd2hpbGUgKEJlZ2luICE9IEVuZCkgVG1wLnB1c2hfYmFjaygoQmVnaW4rKyktPnN0cigpKTsKICAgICAgUnggPSAiXlxccyooKFxcK3wtKT9bMC05XSspXFxzKiw/XFxzKiQiOwogICAgICBpbnQgUG9zID0gMDsgIAogICAgICBmb3IoY29uc3QgYXV0byAmaTpUbXApIHsgIAogICAgICAgIHN0ZDo6c21hdGNoIE1hdGNoOyAgCiAgICAgICAgc3RkOjpyZWdleF9zZWFyY2goaSwgTWF0Y2gsIFJ4KTsKICAgICAgICBpZiAoTWF0Y2guc2l6ZSgpID09IDMpIAogICAgICAgICAgdHJ5IHsgCiAgICAgICAgICAJUmV0LnB1c2hfYmFjayhzdGQ6OnN0b2koTWF0Y2guc3RyKDEpLG51bGxwdHIsMTApKTsgCiAgICAgICAgICB9IGNhdGNoKC4uLikgewogICAgICAgICAgCXRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgi0JIg0L/QvtC30LjRhtC40LggIitzdGQ6OnRvX3N0cmluZyhQb3MpKyIg0YHQu9C40YjQutC+0Lwg0LTQu9C40L3QvdC+0LUg0YfQuNGB0LvQviIpOwogICAgICAgICAgfSAKICAgICAgICBlbHNlIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgi0JIg0L/QvtC30LjRhtC40LggIitzdGQ6OnRvX3N0cmluZyhQb3MpKyIg0L3QtSDRh9C40YHQu9C+Iik7CiAgICAgICAgUG9zKys7ICAgICAgICAgICAgICAgIAogICAgICB9ICAKICAgICAgcmV0dXJuIFJldDsKICAgIH0KICAgICAKICAgIGludCBtYWluKCkgewogICAgICBmb3IoY29uc3QgYXV0byAmaTogewkKICAgICAgICAiMSwgNCwgNSwgLTYsIC04ICwgMywgMSIsCiAgICAgICAgIjEsIDMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzQsIDUsIC02LCAtOCAsIDMsIDEiLCAgICAgICAgCiAgICAgICAgIiAgICAgICA1ICwgNiwgNTcsICs2OCAsIDE4LCAzMiwgNCAgICIsCiAgICAgICAgIjc3IiwKICAgICAgICAiIiwKICAgICAgICAiICAgICIsCiAgICAgICAgIjEsIDQsIDUsIDYsIDgsIDMsIDEsIiwKICAgICAgICAiICwgNiwgNTcsIDY4ICwgMTgsIDMyLCA0IiwKICAgICAgICAiNSwgNiwgLCA2OCwgMTgsIDMyLCA0IiwKICAgICAgICAiNSwgNiwsIDY4LCAxOCwgMzIsIDQiLAogICAgICAgICI1LCA2LCBULCA2OCwgMTgsIDMyLCA0IiwKICAgICAgICAiNSwgNiwgMzRULCA2OCwgMTgsIDMyLCA0IiwKICAgICAgICAiNSwgNiwgMzQgNTUsIDY4LCAxOCwgMzIsIDQiLAogICAgICAgICIsIiwKICAgICAgICAiLCwiLAogICAgICAgICIsLCAsLCAsLCwifSkgeyAKICAgICAgICB0cnkgewogICAgICAJICBzdGQ6OmNvdXQgPDwgIlwiIiA8PCBpIDw8ICJcIjogIjsKICAgICAgCSAgcGFyc2UoaSk7CiAgICAgIAkgIHN0ZDo6Y291dCA8PCAiT2siOwogICAgICAgIH0gY2F0Y2ggKHN0ZDo6aW52YWxpZF9hcmd1bWVudCAmRSkgewogICAgICAgICAgc3RkOjpjb3V0IDw8IEUud2hhdCgpOwogICAgICAgIH0gIAogICAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CiAgICAgIH0gIAogICAgICByZXR1cm4gMDsKICAgIH0=
stdout
"1, 4, 5, -6, -8 , 3, 1": Ok
"1, 3333333333333333333333333334, 5, -6, -8 , 3, 1": В позиции 1 слишком длинное число
" 5 , 6, 57, +68 , 18, 32, 4 ": Ok
"77": Ok
"": Пустая строка
" ": Пустая строка
"1, 4, 5, 6, 8, 3, 1,": В последней позиции не число
" , 6, 57, 68 , 18, 32, 4": В первой позиции не число
"5, 6, , 68, 18, 32, 4": В позиции 2 не число
"5, 6,, 68, 18, 32, 4": В позиции 2 не число
"5, 6, T, 68, 18, 32, 4": В позиции 2 не число
"5, 6, 34T, 68, 18, 32, 4": В позиции 2 не число
"5, 6, 34 55, 68, 18, 32, 4": В позиции 2 не число
",": В первой позиции не число
",,": В первой позиции не число
",, ,, ,,,": В первой позиции не число