我不想把家庭工作放在stackoverflow上。提前抱歉。
我必须编写一个符合以下声明的函数
char ** read_maze(char *filename, int *rows, int *cols )
到目前为止我写的功能是
char ** read_maze(char *filename, int *rows, int *cols )
{
ifstream maze(filename);
maze >> *rows >> *cols;
char * contents[] = new char * [*rows * *cols];
for (int r = 0; r < *rows; r++) {
for (int c = 0; c < *cols; c++) {
if (!maze.eof())
maze >> contents[r][c];
}
}
return contents;
}
我遇到的问题是访问/写入char-array contents
给我一个分段错误。我尝试过各种不同的访问器,但我似乎无法防止发生段错误。
我已经尝试使用谷歌搜索如何在c ++中访问点指针字符,但我找不到任何完全重要的内容。
我尝试过的事情:*内容[r * c],(内容+ r c),*((内容[r])+ c)以及其他许多内容。< / p>
如何将文件读入char **
?
由于
答案 0 :(得分:3)
我认为你需要的是:
std::ifstream maze(filename);
std::size_t rowCount, colCount;
maze >> rowCount >> colCount;
std::vector<std::vector<char>> content(rowCount, std::vector<char>(colCount));
for (auto &columns : content) {
for (auto& c : columns) {
maze >> c;
}
}
如果您真的要使用new []
:
char** read_maze(const char* filename, int& rowCount, int& colCount)
{
std::ifstream maze(filename);
maze >> rowCount>> colCount;
char** contents = new char* [rowCount];
for (int r = 0; r != rowCount; ++r) {
contents[r] = new char[colCount];
for (int c = 0; c != colCount; ++c) {
if (!maze.eof()) {
maze >> contents[r][c];
}
}
}
return contents;
}
但是你必须自己使用delete[]
void delete_maze(char** contents, int rowCount)
{
for (int r = 0; r != rowCount; ++r) {
delete [] contents[r];
}
delete [] contents;
}
答案 1 :(得分:0)
使用此行,您可以指向字符指针。
char **contents = new char * [*rows * *cols];
现在你有很多char指针,你必须分配内存。 你可以这样做:
for (int r = 0; r < *rows; r++) {
for (int c = 0; c < *cols; c++) {
contents[r][c] = new char[SIZE_OF_STRING];
}
}
或者您可以使用std::string
来避免C-Style char * -pointers。