【发布时间】:2016-06-09 04:05:26
【问题描述】:
我用过很多 PHP 和一些 C++,但我对 C 是全新的,你可以从我乱七八糟的代码中看出这一点。基本上,我希望将 .txt 文件(网格,在这种情况下为我和我的朋友制作游戏)的内容读入 2d 数组,处理文件的内容,并将处理后的内容输出到单独的.txt 文件。
void grab_input(char *infile, int *rows, int *cols, char *buffer);
void send_output(char *outfile, int rows, int cols, char buffer);
int process_input(char *buffer);
int main(int argc, char *argv[])
{
int rows;
int cols;
int i;
char **buffer;
if (argc != 2)
{
printf("Usage: %s filename\n", argv[0]);
exit(EXIT_FAILURE);
}
buffer = (char**)malloc((rows + 2) * sizeof(char *));
for (i = 0; i < rows; i++)
buffer[i] = (char *)malloc(cols*sizeof(char));
grab_input(argv[1], &rows, &cols, &buffer);
process_input(&buffer);
send_output(argv[2], rows, cols, *buffer);
printf("\n%s\n", argv[2]);
printf("%d\n", cols);
return 0;
}
void grab_input(char *infile, int *rows, int *cols, char *buffer)
{
FILE *input;
input = fopen(infile, "r");
if (input != 0)
printf("The file exists.\n");
else
printf("No file.\n");
fscanf(input, "%d %d", rows, cols);
printf("Unprocessed grid:");
while (fgets(buffer, (*rows+2) * (*cols+2) * sizeof(char)+1, input) != NULL) {
printf("%s", buffer);
}
fclose(input);
printf("\nRows: %d\nColumns: %d\n", *rows, *cols);
}
为此,我收到多个控制台错误和“调试错误...变量 cols 周围的堆栈已损坏。”我在各个站点上阅读了大量有关动态内存分配的内容,但我显然不太了解如何将其付诸实践并从文件中创建动态分配的 2D 数组。如果您能帮助我,将不胜感激。
Here's a picture of my console window.
And here's one of the contents of my input.txt file.
非常感谢您的帮助。
【问题讨论】:
-
请不要将文字作为图片发布。而且外部链接更是如此。将控制台输出和输入文件内容作为文本复制到问题中。否则其他人无法复制文本以发表评论或复制您的问题。
-
将您阅读的内容传递给
printf()的第一个参数是安全风险。如果读取像%s%s%s%s%s%s%s%s%s%s这样的东西怎么办?使用printf("%s", buffer);或fputs(buffer, stdout);。 -
buffer = (char*) malloc((rows+2) * (cols+2) * sizeof(char));。这不是为二维数组分配内存的正确方法。进行搜索,有很多现有的问题可以解决这个问题。此外,您的代码有太多基本错误。当然编译器会发出警告,你不应该忽略这些。例如,grab_input的最后一个参数定义为char *,但您使用char ***调用它。比你为buffer分配内存更糟糕的是在你已经尝试在fgets中使用它。fgets不会为你分配内存。 -
@kaylum 第三个参数是
int*没错。作为grab_input()的第四个参数传递的是char***,而不是char**。 -
打开编译器警告将是一个好的开始。您将
&buffer传递给char ***类型的grab_input,它需要char *。您的编译器应该对此发出警告。这不可能做你想做的。
标签: c windows memory memory-management multidimensional-array