2011-12-23 23 views
-3

これは前の質問のフォローアップです。文字配列を文字列に分割する

Parsing file names from a character array

答えは、関連したが、私はまだ問題を抱えています。文字列が分割されていると、エラーログに文字列やcstringのいずれかで正しく出力されるようには見えません。正直言って、彼の答えの仕組みを完全には理解できません。紳士が提供した答えを誰かがさらに説明しています。どのように文字列を文字列に分割するのではなく、より多くの文字列に分割するのですか?これが答えでした。

std::istringstream iss(the_array); 
std::string f1, f2, f3, f4; 
iss >> f1 >> f2 >> f3 >> f4; 

私は30種類の文字列があるとします。確かに、私はf1、f2 .... f30と書くことはできません。

これを行う方法に関するアドバイスはありますか?

+6

説明が必要な場合は、解答にコメントしてください。 –

+2

また、投稿に署名するのをやめてください。 –

+0

@ TomalakGeret'kalサインインしていますか? –

答えて

3

あなたは明示的なforループを避けることもできますし、もしそうなら現代的なC++に自然な方法を試すことさえできます。

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <string> 
#include <sstream> 
#include <iterator> 

int main() 
{ 
    // Your files are here, separated by 3 spaces for example. 
    std::string s("picture1.bmp file2.txt random.wtf dance.png"); 

    // The stringstream will do the dirty work and deal with the spaces. 
    std::istringstream iss(s); 

    // Your filenames will be put into this vector. 
    std::vector<std::string> v; 

    // Copy every filename to a vector. 
    std::copy(std::istream_iterator<std::string>(iss), 
    std::istream_iterator<std::string>(), 
    std::back_inserter(v)); 

    // They are now in the vector, print them or do whatever you want with them! 
    for(int i = 0; i < v.size(); ++i) 
    std::cout << v[i] << "\n"; 
} 

これは、「私は30の異なる文字列があります」というようなシナリオを処理する明白な方法です。それらをすべてどこかに格納しておけば、ファイル名で何をしたいかによってstd :: vectorが適しているでしょう。この方法では、すべての文字列に名前(f1、f2、...)を付ける必要はありません。たとえば、必要に応じてベクトルのインデックスで参照できます。

+0

+1これは私の提案よりも優れています。 – hmjd