0

Visual Studio 2010 C++ を使用していますが、このような複数のパスを持つ長い文字列があります。

C:\eula0.txt

C:\eula1.txt

C:\eula2.txt

C:\eula3.txt

C:\eula4.txt

上記のファイル パスはすべて、単一の文字列 "S" です。各パスの間に改行文字「\n」があります。各パスを単一の文字列パスとして抽出したい。

最終的な出力は次のようになります。

文字列 s0 = C:\eula0.txt

文字列 s1 = C:\eula1.txt

文字列 s2 = C:\eula2.txt

文字列 s3 = C:\eula3.txt

文字列 s4 = C:\eula4.txt

これどうやってするの。私を助けてください。ありがとう。

4

6 に答える 6

2

この例では、個々の文字列をベクトルにコピーし、それぞれをstdoutに出力します。それはセパレーターとしてのistream_iterator使用という事実に依存しています。\n他の空白文字も区切り文字として使用されるため、ファイル名に空白が含まれている場合は機能しないことに注意してください。

#include <string>
#include <iostream>
#include <sstream>
#include <iterator>
#include <vector> 
int main()
{
  std::string s("C:\\eula0.txt\nC:\\eula1.txt\nC:\\eula2.txt");

  std::stringstream str(s);
  std::vector<std::string> v((std::istream_iterator<std::string>(str)),
                             (std::istream_iterator<std::string>()));

  for (const auto& i : v) 
    std::cout << i << "\n";
}
于 2013-02-18T13:10:14.103 に答える
1

別の方法、またはより C の方法:

char *tmp;
char *input = ...; // Pointer to your input, must be modifiable null terminated string
char *buffer[256]; // Pick appropriate size
int i=0;

while((tmp=strchr(input, '\n'))
{
    *tmp = 0;
    buffer[i++] = strdup(input);
    input = ++tmp;
    // We replaced the newlines with null-terminators,
    // you may now undo that if you want.
}
buffer[i] = strdup(input); // Last entry or if no newline is present

Ps 後で strdup が割り当てたメモリを解放し、いくつかの健全性チェックを行うことを忘れないでください :)

(ここで何が起こっているのかを教えてほしい場合は言ってください。詳しく説明します。)

于 2013-02-18T13:11:57.990 に答える
1

std::stringfind_first_of member関数を使用して独自のカスタム ループを作成するだけです。それも一つの方法でしょう。他にもたくさんの方法があります。

于 2013-02-18T12:58:51.510 に答える
0

このように書きました。完璧に動作します。

ありがとうございます。

void GetFilePathFromMultipleStringPaths(const char* urls)
{
    int n = 0;
    vector<string> tokens; // Create vector to hold paths
    std::string s = urls;
    std::string::size_type prev_pos = 0, pos = 0;
    while( (pos = s.find('\n', pos)) != std::string::npos )
    {
        std::string substring( s.substr(prev_pos, pos-prev_pos) );
        tokens.push_back(substring);
        prev_pos = ++pos;
        n++;
    }
    std::string substring( s.substr(prev_pos, pos-prev_pos) ); // Last path
    if(substring.data() != NULL)
    {
        tokens.push_back(substring);
        n++;
    }
    for (int i=0; i<n; i++)
    {
        cout<<tokens[i].c_str()<<"  "<<i<<endl;
    }
}
于 2013-02-18T13:33:21.083 に答える