c-重用字符指针数组



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

// 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("%sn", 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("%sn", lines[j]);
            }
            // delete lines, delete file
            memset(lines, 0, sizeof(*lines));
            fclose(fp);
        }  
    }
    // all files read
    return progReturn;
}

在第一个文件中,所有操作都没有问题。在第二个文件中,当我打印数组时,它会显示不可打印的字符,以及第一个文件中的一些行。

是什么原因导致了这个问题?我是否未完全清除**lines


EDIT:示例输入和输出:

输入文件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(。这些元素未初始化并且包含垃圾。

  1. char **lines初始化移到for循环之外
  2. 将索引计数器i重命名为其他名称
  3. 在多个文件上重复调用lines[i] = malloc(...)会导致内存泄漏。考虑在for循环中使用free,或者将初始化的这一部分移到for循环之外

相关内容

  • 没有找到相关文章

最新更新