我正在使用Visual Studio 2010 C ++,我有一个包含多个这样的路径的长字符串。
C:\ eula0.txt
C:\ eula1.txt
C:\ eula2.txt
C:\ eula3.txt
C:\ eula4.txt
以上所有文件路径都在一个字符串“S”中。每条路径之间都有一个新的字符串“\ n”。我想将每个路径提取为单个字符串路径。
最终输出应该是这样的。
string s0 = C:\ eula0.txt
string s1 = C:\ eula1.txt
string s2 = C:\ eula2.txt
string s3 = C:\ eula3.txt
string s4 = C:\ eula4.txt
我该怎么做?请帮我。 感谢。
答案 0 :(得分: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";
}
答案 1 :(得分: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";
}
答案 2 :(得分:1)
使用std::string
的{{1}}功能创建自己的自定义循环。这将是一种方式。还有很多其他方法。
答案 3 :(得分:1)
您可以将istringstream
和getline
用于此
std::istringstream ss(S);
std::string s0, s1, s2, ...;
std::getline(ss, s0);
std::getline(ss, s1);
...
答案 4 :(得分: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
P.s不要忘记以后释放内存strdup为你分配并做一些健全检查:)
(告诉我你是否需要我告诉我们这里有什么,我会进一步解释。)
答案 5 :(得分: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;
}
}