gpt4 book ai didi

c - 重用字符指针数组

转载 作者:太空宇宙 更新时间:2023-11-04 08:09:34 26 4
gpt4 key购买 nike

假设我想“重用”一个 char 指针数组,就像下面的程序一样,循环参数列表中给定的文件,循环文件中的行,将它们添加到动态分配的数组中,然后打印它:

// includes
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

// globals
int progReturn = 0;
int globalLineCounter = 0;



////// main
int main(int argc, char *argv[]) {
FILE *fp;
int i;


// iterate files. first arg is the program name
for (i = 1; i < argc; i++) {
fp = fopen(argv[i], "r");
if (fp == NULL) {
fprintf(stderr, "The file '%s' did not exist.\n", argv[i]);
progReturn = 1;

} else {

// read lines from the file
char line[256];

// THE PROBLEM: I'd like to completely clear this array.
char **lines = malloc(16 * sizeof(char*));

// iterate lines
int fileLineCounter = 0;
while (fgets(line, sizeof(line), fp)) {

// remove newline
strtok(line, "\n");

// add lines to array
lines[globalLineCounter] = malloc(256 * sizeof(char));
strcpy(lines[globalLineCounter], line);
//printf("%s\n", lines[globalLineCounter]); // tester

fileLineCounter++;
globalLineCounter++;
}
// all lines read
printf("The file '%s' had %d lines.\n", argv[i], fileLineCounter);

// print the array
int j=0;
for (j=0; j<fileLineCounter; j++) {
// PROBLEM: Garbage from the second file when it prints here.
printf("%s\n", lines[j]);
}

// delete lines, delete file
memset(lines, 0, sizeof(*lines));
fclose(fp);
}
}
// all files read

return progReturn;
}

在第一个文件中,一切正常。在第二个文件上,当我打印数组时,它显示了不可打印的字符,以及第一个文件中的一些行。

是什么导致了这个问题?我没有完全清除 **行吗?


编辑:示例输入和输出:

输入文件 foo:

This is a test
of the lineSort program
in order to
test its capabilities.
Lots of whitespace too!
aaa

bbb

cccccc



aaa
ggggg
hhhhh
fffff
eeeee
ddddd
ppppp

输入文件栏:

aaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbb
zzzzzzzzzzzzzzzzz
ccccccccccccccccc
yyyyyyyyyyyyyyyyy

sortLine foo bar 的输出:

The file 'foo' had 20 lines.





cccccc
Lots of whitespace too!
This is a test
aaa
aaa
bbb
ddddd
eeeee
fffff
ggggg
hhhhh
in order to
of the lineSort program
ppppp
test its capabilities.
The file 'bar' had 5 lines.
(x▒▒
(x▒▒
Lots of whitespace too!
in order to
test its capabilities.

最佳答案

    strcpy(lines[globalLineCounter], line);

这看起来像是您的主要问题。 globalLineCounter 在所有输入文件中不断增加。

假设您的第一个输入文件包含 10 行,第二个文件包含 5 行。然后您的代码将创建一个动态数组(由动态数组组成)并将第一个文件中的行存储在元素 0 .. 9 中(然后打印它们)。您永远不会释放任何已分配的内存,因此它会在循环结束时全部泄漏。

对于第二个文件,您创建了另一个动态数组。您将第二个文件中的 5 行存储在元素 10 .. 14 中(通过 globalLineCounter),然后打印元素 0 .. 4 (fileLineCounter)。这些元素未初始化并且包含垃圾。

关于c - 重用字符指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40444768/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com