2017-02-07 20 views
2

cin >> *integerVar >> *charVar;可以正確讀取「25 b」等輸入。用現有的字符串做這件事最簡單的方法是什麼(我可以通過拆分然後解析每個部分手動完成,但是更好的方法是什麼)?如何解析一個字符串在C++中的多種類型?

+4

'性病:: stringstream的解析器(「我的源字符串」);'現在你可以使用'parser'正是你使用'同樣的方式cin'。文檔:http://en.cppreference.com/w/cpp/io/basic_stringstream – user4581301

+0

你爲什麼使用指針? C++語言不是C#或Java;你不需要爲每個變量或實例使用'new'運算符。 –

回答

6

使用的istringstream等,例如:

#include <string> 
#include <sstream> 

int main(void) 
{ 
    std::istringstream ss("25 b"); 
    int x; std::string bstr; 

    ss >> x >> bstr; 

    return 0; 
} 

// note that std:istringstream allows ss >> x, but not ss << "some value". 
// if you want to support both reading and writing, use a stringstream (which would then support ss >> x as well as ss << "some value") 
+1

我們不應該使用'istringstream'作爲更專業的類嗎? – HolyBlackCat

+0

@HolyBlackCat:我認爲'istringstream'能更好地表達意圖,如果你只想讀,但'stringstream'也可以。 –

+0

@HolyBlackCat:是的,那會更好;糾正了答案;感謝您的評論。 –

4

可以利用stringstreamstring(模板)類:

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

int main() { 
    std::string s; 
    std::getline(std::cin, s); 
    std::stringstream ss(s); 
    int n; 
    char c; 
    ss >> n >> c; 
    return 0; 
} 
5

通過使用std::stringstream

std::stringstream myStr{"25 b"}; 
myStr >> *integerVar >> *charVar; 
0

你可以用哪個做sscanf ES完全相同的東西scanf函數,但使用字符串而不是STD輸入

#include<iostream> 
#include<stdlib> 
#include<stdio> 
int main(){ 
    std::string str; 
    char character; 
    int intnumber; 
    cin >> str; 
    sscanf (str.c_str(), "%d%c", &intnumber, &character); 
} 
+0

更好舉一個例子,因爲這需要一個'字符串'的工作和'scanf'的一些按摩和朋友是臭名昭着的時候提供錯誤的數據類型。 – user4581301

+0

@ user4581301這樣的事情好嗎? – ZioCain

+0

非常接近。推薦使用'std :: string'替代'char *'替換'str','char'替代'char *'替換'character',並且'sscanf(str.c_str(),「%d%c 「,&intnumber,&character);'在通話中。因爲否則,你正在使用一些未初始化的指針(以及在調用中的額外級別的尋址)。 – user4581301