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

尝试getline

#include <string>
#include <sstream>

std::string S = /* your string */;
std::istringstream iss(S);

for (std::string line; std::getline(iss, line); )
{
    std::cout << "Have file: " << line << "\n";
}
于 2013-02-18T13:00:28.327 回答
2

此示例将单个字符串复制到一个向量中,并将每个字符串打印到标准输出。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

只需使用std::string'find_first_of member函数创建您自己的自定义循环。那将是一种方式。还有很多其他的方法。

于 2013-02-18T12:58:51.510 回答
1

你可以使用istringstreamandgetline为此

std::istringstream ss(S);
std::string s0, s1, s2, ...;
std::getline(ss, s0);
std::getline(ss, s1);
...
于 2013-02-18T13:01:05.757 回答
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 回答
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 回答