2016-04-18 22 views
5

我有串这样的: “123plus43times7”++字符串流在C解析单词号码串

其中编号,接着从一词典中的单词。

我明白,我可以通过使用>>运营商提取INT /编号:

StringStream >> number 

我能得到多少。但是,Stream中仍然有数字。如何在数字长度未知时删除数字,或者我应该找出数字的长度,然后使用str.substr()创建新的字符串流? 任何其他更好的使用C++ STL String和SStream的方法将非常感激。

+1

之间的空格这似乎简单了很多,只是读取整个字符串转换成std :: string,然后迭代字符以将其分成连续的数字和字母块。当你分开块时,你可以通过'std :: atoi()'将数字序列转换成整数。 –

+0

@DanMašek是正确的。一旦你得到一个数字,你只需要一个'string'和一个'>>'到'string'就可以停止空格。它会抓住你的信件,你的电话号码和其他一切。 – user4581301

回答

3

您可以插入文本和数字,然后用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; 
} 
+0

'while(ss >> s)'做什么?它似乎覆盖了原来的字符串's'。这是否意味着'ss'保留了(原始)'s'的副本? –

+0

每次都会覆盖's'。 'ss'类似于一个文件流,它的内容不会改变,但是在每次操作之后它会移动到下一个文件位置。在这里查看结果:https://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; 
    }