我有一个char
数组,我需要提取这个数组的子集并将它们存储在std::string
中。我试图基于找到\n
字符将数组拆分成行。解决这个问题的最佳方式是什么?
int size = 4096;
char* buffer = new char[size];
// ...Array gets filled
std::string line;
// Find the chars up to the next newline, and store them in "line"
ProcessLine(line);
可能需要这样的界面:
std::string line = GetSubstring(char* src, int begin, int end);
答案 0 :(得分:8)
我会创建std::string
作为第一步,因为拆分结果会容易得多。
int size = 4096;
char* buffer = new char[size];
// ... Array gets filled
// make sure it's null-terminated
std::string lines(buffer);
// Tokenize on '\n' and process individually
std::istringstream split(lines);
for (std::string line; std::getline(split, line, '\n'); ) {
ProcessLine(line);
}
答案 1 :(得分:5)
您可以使用std::string(const char *s, size_t n)
构造函数从C字符串的子字符串构建std::string
。传入的指针可以是C字符串的中间位置;它不需要是第一个角色。
如果您需要更多,请更新您的问题,详细说明您的绊脚石的确切位置。
答案 2 :(得分:1)
你最好的选择(最好的意思是最简单)是使用strtok
并通过构造函数将标记转换为std::string
。 (请注意,纯strtok
不可重入,因为您需要使用非标准strtok_r
)。
void ProcessTextBlock(char* str)
{
std::vector<std::string> v;
char* tok = strtok(str,"\n");
while(tok != NULL)
{
ProcessLine(std::string(tok));
tok = strtok(tok,"\n");
}
}
答案 3 :(得分:1)
我没有意识到你只想一次处理一行,但为了防止你一次需要所有行,你也可以这样做:
std::vector<std::string> lines;
char *s = buffer;
char *head = s;
while (*s) {
if (*s == '\n') { // Line break found
*s = '\0'; // Change it to a null character
lines.push_back(head); // Add this line to our vector
head = ++s;
} else s++; //
}
lines.push_back(head); // Add the last line
std::vector<std::string>::iterator it;
for (it = lines.begin(); it != lines.end(); it++) {
// You can process each line here if you want
ProcessLine(*it);
}
// Or you can process all the lines in a separate function:
ProcessLines(lines);
// Cleanup
lines.erase(lines.begin(), lines.end());
我已经修改了缓冲区,vector.push_back()方法自动从每个生成的C子串生成std :: string对象。
答案 4 :(得分:0)
您可以使用std :: string的构造函数将char *的子字符串转换为std :: string:
template< class InputIterator >
basic_string( InputIterator first, InputIterator last, const Allocator& alloc = Allocator() );
做一些像:
char *cstr = "abcd";
std::string str(cstr + 1, cstr + 3);
在那种情况下,str将是“bc”。