C ++中的字符串流以解析单词和数字的字符串

Posted

技术标签:

【中文标题】C ++中的字符串流以解析单词和数字的字符串【英文标题】:String Stream in C++ to parse string of words & numbers 【发布时间】:2016-04-18 23:22:33 【问题描述】:

我有这样的字符串: '123plus43times7'

其中数字后跟字典中的单词。

我知道我可以使用>> 运算符提取整数/数字:

StringStream >> number

我可以得到号码。但是,Stream 中仍然有数字。当数字的长度未知时如何删除数字,或者我应该找出数字的长度然后使用 str.substr() 创建一个新的 String Stream ? 任何其他使用 C++ STL String 和 SStream 的更好方法将不胜感激。

【问题讨论】:

将整个字符串读入 std::string 然后遍历字符以将其分成连续数字块和字母块似乎要简单得多。将块分开后,您可以通过std::atoi() 将数字序列转换为整数。 @DanMašek 是正确的。一旦你得到一个号码,你抓住一个string 和一个>> 到一个string 只会在空白处停止。它会抓住你的字母、数字和其他一切阻碍它的东西。 【参考方案1】:

您可以在文本和数字之间插入空格,然后使用std::stringstream

#include <iostream>
#include <string>
#include <sstream>
#include <cctype>

int main() 

    std::string s = "123plus43times7";
    for (size_t i = 0; i < (s.size() -1 ); i++)
    
        if (std::isalpha(s[i]) != std::isalpha(s[i + 1]))
        
            i++;
            s.insert(i, " ");
        
    
    std::stringstream ss(s);
    while (ss >> s)
        std::cout << s << "\n";
    return 0;

【讨论】:

while (ss &gt;&gt; s) 是做什么的?它似乎覆盖了原始字符串s。这是否意味着ss 保留了一份(原件)s 这将覆盖s 每次。 ss 类似于文件流,它的内容不会改变,但会在每次操作后移动到下一个文件位置。在此处查看结果:ideone.com/qvJvMV【参考方案2】:

这是一种方法

string as = "123plus43times7";

    for (int i = 0; i < as.length(); ++i)
    
        if (isalpha(as[i]))
            as[i] = ' ';
    

    stringstream ss(as);
    int anum;

    while (ss >> anum)
    
        cout << "\n" << anum;
    

【讨论】:

以上是关于C ++中的字符串流以解析单词和数字的字符串的主要内容,如果未能解决你的问题,请参考以下文章

从图像中解析字符以进行 OCR 的算法

从字符串中提取数字以允许单词变化

10 位或 6 位数字的正则表达式不应以“/”开头和结尾,也可以是字符串中的单个单词 [重复]

如何用c语言分离字符串中的字母和数字并分别输出?

c ++ char vector,删除带有数字的单词加上坏单词后的空格

字符密码怎么设置啊