提取运算符到非数字字符
Extraction operator into non-numeric character
给定一个 istringstream
,是否可以将其内容 "extract" 转换为一个字符 只有当要提取的字符是非数字的(即不是 0-9)?
比如这个
string foo = "+ 2 3";
istringstream iss(foo);
char c;
iss >> skipws >> c; //Do this only if c would be non-numeric
应该提取 '+'
,但如果 foo
是 "2 + 3"
,则不应提取任何内容,因为第一个 [非空白] 字符是 '2'
, 是数字。
为了提供一些上下文,我需要它来制作递归 "normal polish notation"(即前缀表示法)解析器。
您可以使用 istream::peek
在提取之前检查下一个字符是什么。您可以根据您的可接受范围测试 peek
的结果,如果匹配,则进行实际提取。
顺便说一句,如果您想跳过空格,您还需要使用 peek()
检查并处理它(通过提取和丢弃空格字符)。即使使用 skipws
,peek()
也不会越过空格。
如果是数字,可以用unget
把字符放回去。
string foo = "+ 2 3";
istringstream iss(foo);
char c;
iss >> skipws >> c;
if (std::isdigit(c)) iss.unget();
给定一个 istringstream
,是否可以将其内容 "extract" 转换为一个字符 只有当要提取的字符是非数字的(即不是 0-9)?
比如这个
string foo = "+ 2 3";
istringstream iss(foo);
char c;
iss >> skipws >> c; //Do this only if c would be non-numeric
应该提取 '+'
,但如果 foo
是 "2 + 3"
,则不应提取任何内容,因为第一个 [非空白] 字符是 '2'
, 是数字。
为了提供一些上下文,我需要它来制作递归 "normal polish notation"(即前缀表示法)解析器。
您可以使用 istream::peek
在提取之前检查下一个字符是什么。您可以根据您的可接受范围测试 peek
的结果,如果匹配,则进行实际提取。
顺便说一句,如果您想跳过空格,您还需要使用 peek()
检查并处理它(通过提取和丢弃空格字符)。即使使用 skipws
,peek()
也不会越过空格。
如果是数字,可以用unget
把字符放回去。
string foo = "+ 2 3";
istringstream iss(foo);
char c;
iss >> skipws >> c;
if (std::isdigit(c)) iss.unget();