#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 ) ;
std:: cout << "\" " << iStr << "\" : " ;
try {
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 )
Ret.push_back ( std:: stoi ( Match.str ( 1 ) ,nullptr,10 ) ) ;
else
throw std:: invalid_argument ( "В позиции " + std:: to_string ( Pos) + " не число" ) ;
Pos++ ;
}
std:: cout << "Ok" ;
} catch ( std:: invalid_argument & E) {
std:: cout << E.what ( ) ;
}
std:: cout << std:: endl ;
return Ret;
}
int main( ) {
parse( "1, 4, 5, -6, -8 , 3, 1" ) ;
parse( " 5 , 6, 57, +68 , 18, 32, 4 " ) ;
parse( "77" ) ;
parse( "" ) ;
parse( " " ) ;
parse( "1, 4, 5, 6, 8, 3, 1," ) ;
parse( " , 6, 57, 68 , 18, 32, 4" ) ;
parse( "5, 6, , 68, 18, 32, 4" ) ;
parse( "5, 6,, 68, 18, 32, 4" ) ;
parse( "5, 6, T, 68, 18, 32, 4" ) ;
parse( "5, 6, 34T, 68, 18, 32, 4" ) ;
parse( "5, 6, 34 55, 68, 18, 32, 4" ) ;
parse( "," ) ;
parse( ",," ) ;
parse( ",, ,, ,,," ) ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxyZWdleD4KCnN0ZDo6dmVjdG9yPGludD4gcGFyc2UoY29uc3Qgc3RkOjpzdHJpbmcgJmlTdHIpIHsKICBzdGQ6OnZlY3RvcjxpbnQ+IFJldDsKICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gVG1wOyAKICBzdGQ6OnN0cmluZyBXb3JrKGlTdHIpOwogIFdvcmsuZXJhc2UoMCxXb3JrLmZpbmRfZmlyc3Rfbm90X29mKCcgJykpOwogIFdvcmsuZXJhc2UoV29yay5maW5kX2xhc3Rfbm90X29mKCcgJykrMSk7IAogIHN0ZDo6Y291dCA8PCAiXCIiIDw8IGlTdHIgPDwgIlwiOiAiOyAgICAKICB0cnkgeyAgCiAgICBpZiAoV29yay5sZW5ndGgoKSA9PSAwKSB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoItCf0YPRgdGC0LDRjyDRgdGC0YDQvtC60LAiKTsKICAgIGlmIChXb3JrWzBdID09ICcsJykgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCLQkiDQv9C10YDQstC+0Lkg0L/QvtC30LjRhtC40Lgg0L3QtSDRh9C40YHQu9C+Iik7CiAgICBpZiAoV29ya1tXb3JrLmxlbmd0aCgpLTFdID09ICcsJykgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCLQkiDQv9C+0YHQu9C10LTQvdC10Lkg0L/QvtC30LjRhtC40Lgg0L3QtSDRh9C40YHQu9C+Iik7ICAKICAgIHN0ZDo6cmVnZXggUngoIlxccyosXFxzKiIpOwogICAgc3RkOjpzcmVnZXhfdG9rZW5faXRlcmF0b3IgQmVnaW4oV29yay5iZWdpbigpLCBXb3JrLmVuZCgpLCBSeCwgLTEpOwogICAgc3RkOjpzcmVnZXhfdG9rZW5faXRlcmF0b3IgRW5kOwogICAgd2hpbGUgKEJlZ2luICE9IEVuZCkgVG1wLnB1c2hfYmFjaygoQmVnaW4rKyktPnN0cigpKTsKICAgIFJ4ID0gIl5cXHMqKChcXCt8LSk/WzAtOV0rKVxccyosP1xccyokIjsKICAgIGludCBQb3MgPSAwOyAgCiAgICBmb3IoY29uc3QgYXV0byAmaTpUbXApIHsgIAogICAgICBzdGQ6OnNtYXRjaCBNYXRjaDsgIAogICAgICBzdGQ6OnJlZ2V4X3NlYXJjaChpLCBNYXRjaCwgUngpOwogICAgICBpZiAoTWF0Y2guc2l6ZSgpID09IDMpIAogICAgICAgIFJldC5wdXNoX2JhY2soc3RkOjpzdG9pKE1hdGNoLnN0cigxKSxudWxscHRyLDEwKSk7IAogICAgICBlbHNlIAogICAgICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgi0JIg0L/QvtC30LjRhtC40LggIitzdGQ6OnRvX3N0cmluZyhQb3MpKyIg0L3QtSDRh9C40YHQu9C+Iik7CiAgICAgIFBvcysrOyAgICAgICAgICAgICAgICAKICAgIH0gIAogICAgc3RkOjpjb3V0IDw8ICJPayI7ICAKICB9IGNhdGNoIChzdGQ6OmludmFsaWRfYXJndW1lbnQgJkUpIHsKICAgIHN0ZDo6Y291dCA8PCBFLndoYXQoKTsKICB9CiAgc3RkOjpjb3V0IDw8IHN0ZDo6IGVuZGw7CiAgcmV0dXJuIFJldDsKfQoKaW50IG1haW4oKSB7CiAgcGFyc2UoIjEsIDQsIDUsIC02LCAtOCAsIDMsIDEiKTsKICBwYXJzZSgiICAgICAgIDUgLCA2LCA1NywgKzY4ICwgMTgsIDMyLCA0ICAgIik7CiAgcGFyc2UoIjc3Iik7CiAgcGFyc2UoIiIpOwogIHBhcnNlKCIgICAgIik7CiAgcGFyc2UoIjEsIDQsIDUsIDYsIDgsIDMsIDEsIik7CiAgcGFyc2UoIiAsIDYsIDU3LCA2OCAsIDE4LCAzMiwgNCIpOwogIHBhcnNlKCI1LCA2LCAsIDY4LCAxOCwgMzIsIDQiKTsKICBwYXJzZSgiNSwgNiwsIDY4LCAxOCwgMzIsIDQiKTsKICBwYXJzZSgiNSwgNiwgVCwgNjgsIDE4LCAzMiwgNCIpOwogIHBhcnNlKCI1LCA2LCAzNFQsIDY4LCAxOCwgMzIsIDQiKTsKICBwYXJzZSgiNSwgNiwgMzQgNTUsIDY4LCAxOCwgMzIsIDQiKTsKICBwYXJzZSgiLCIpOwogIHBhcnNlKCIsLCIpOwogIHBhcnNlKCIsLCAsLCAsLCwiKTsKICByZXR1cm4gMDsKfQ==
stdout
"1, 4, 5, -6, -8 , 3, 1": Ok
" 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 не число
",": В первой позиции не число
",,": В первой позиции не число
",, ,, ,,,": В первой позиции не число