如何使用多个分隔符将字符串流拆分为单个字符串? 现在它使用默认的空格分隔符,我手动删除第一个和最后一个字符,如果它们是除字母数字以外的任何字符。
这里的目标是读入一个.cpp文件,并解析所有不是C ++中保留字的用户标识。
它适用于良性示例,但对于这样的事情:
OrderedPair<map_iterator, bool> insert(const value_type& kvpair)
它不起作用。我希望能够将OrderedPair分成它自己的单词,map_iterator将它自己,bool,insert,const,value_type和kvpair分成单个单词。
我如何使用“&lt;&gt;,(&amp;)。 - &gt; *”作为我的字符串流的分隔符?
while (getline(inFile, line)) {
isComment = false;
stringstream sstream(line);
while (sstream >> word) {
isCharLiteral = false;
if (!isComment) {
if (word[0] == '/' && word[1] == '/')
isComment = true;
}
if (!isMultilineComment) {
if (word[0] == '/' && word[1] == '*')
isMultilineComment = true;
}
if (!isStringLiteral) {
if (word[0] == '"')
isStringLiteral = true;
}
if (!isCharLiteral) {
if (word[0] == '\'' && word.back() == '\'')
isCharLiteral = true;
}
if (isStringLiteral)
if (word.back() == '"')
isStringLiteral = false;
if (isMultilineComment)
if (word[0] == '*' && word[1] == '/')
isMultilineComment = false;
if (!isStringLiteral && !isMultilineComment && !isComment && !isCharLiteral) {
答案 0 :(得分:0)
如果您能够使用标准库,那么我建议使用std::strtok()
来标记您的字符串。您可以将您喜欢的任何分隔符传递给strtok()
。有一个参考here。
由于您使用的是string
数据类型,要使strtok
正常工作,您必须将字符串复制到长度足够的以null结尾的字符数组中,然后调用{ {1}}在该数组上。
答案 1 :(得分:0)
C ++ std::istream
仅为最常见的用例提供基本输入方法。您可以在此处使用方法std::string
和find_first_of
直接处理find_last_of
,以识别分隔符或非分隔符。很容易在好的strtok
附近构建一些东西,但直接在std::string
上执行,而不是直接在解析后的字符串中写\0
。
但是你要努力实现,你应该考虑到你不应该搜索标识符的帐户评论,字符串文字,宏和编译指示
答案 2 :(得分:0)
您可以使用正则表达式替换要用空格分隔的字符实例。然后使用现有的空白分割设置。 http://en.cppreference.com/w/cpp/regex
或者使用正则表达式获得额外的幻想,只需匹配你想要的东西,然后迭代匹配。