C ++如何使用多个分隔符分割字符串流

时间:2016-03-25 16:15:33

标签: c++ delimiter stringstream

如何使用多个分隔符将字符串流拆分为单个字符串? 现在它使用默认的空格分隔符,我手动删除第一个和最后一个字符,如果它们是除字母数字以外的任何字符。

这里的目标是读入一个.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) {

3 个答案:

答案 0 :(得分:0)

如果您能够使用标准库,那么我建议使用std::strtok()来标记您的字符串。您可以将您喜欢的任何分隔符传递给strtok()。有一个参考here

由于您使用的是string数据类型,要使strtok正常工作,您必须将字符串复制到长度足够的以null结尾的字符数组中,然后调用{ {1}}在该数组上。

答案 1 :(得分:0)

C ++ std::istream仅为最常见的用例提供基本输入方法。您可以在此处使用方法std::stringfind_first_of直接处理find_last_of,以识别分隔符或非分隔符。很容易在好的strtok附近构建一些东西,但直接在std::string上执行,而不是直接在解析后的字符串中写\0

但是你要努力实现,你应该考虑到你不应该搜索标识符的帐户评论,字符串文字,宏和编译指示

答案 2 :(得分:0)

您可以使用正则表达式替换要用空格分隔的字符实例。然后使用现有的空白分割设置。 http://en.cppreference.com/w/cpp/regex

或者使用正则表达式获得额外的幻想,只需匹配你想要的东西,然后迭代匹配。