2016-04-18 57 views
5

böyle dizesi vardır kelimelerin & sayıların dizesini ayrıştırmak için: '123plus43times7' numaralı sözlükten kelimeleri izlemektedirDize Akış ++

.

StringStream >> number 

Ben sayı elde edebilirsiniz:

ben >> operatörü kullanarak int/numaralar elde anlıyoruz. Bununla birlikte, Akış hala onun içinde bir sayıya sahiptir. Numara uzunluğu bilinmiyorsa sayıyı nasıl çıkarabilirim veya sayı uzunluğunu bulmalıyım ve sonra yeni bir String Stream oluşturmak için str.substr() öğesini kullanabilir miyim? C++ STL String ve SStream kullanarak bunu yapmak için daha iyi bir yöntem gerçekten takdir edilecektir.

+1

yapmanın bir yolu var kullanmak arasındaki boşluk ekleyebilirsiniz std :: string ve ardı ardına gelen rakamlar ve blok bloklarının bloklarına ayırmak için karakterlerin üzerinde yineleyin. Blokları ayırdığınızda, std :: atoi() 'ile rakam dizilerini tam sayılara dönüştürebilirsiniz. –

+0

@ DanMašek doğru. Bir numara aldığınızda, bir "dize" ve ">>" ile bir "dize" kaplarsınız, sadece boşlukta duracaktır. Mektuplarınızı, numaralarınızı ve yoluna çıkan diğer her şeyi alacaktır. – user4581301

cevap

3

Sen Sadece içine bütün dize okumak için çok daha basit görünüyor metin ve numaraları ve ardından 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)' ne yapar? Orijinal dizenin 's'nin üzerine yazılıyor gibi görünüyor. Bu, ss'nin (orijinalinin) bir kopyasını sakladığı anlamına mı geliyor? –

+0

Bu, her seferinde 's'nin üzerine yazacaktır. 'ss bir dosya akışına benzer, içeriği değişmez, ancak her işlemden sonra bir sonraki dosya konumuna geçer. Buradaki sonuca bakın: https://ideone.com/qvJvMV –

2

burada o

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; 
    }