1

我需要从 C 中读取一个文件,将其存储在一个数组中并打印其内容。出于某种原因,我在接近尾声的输出中不断看到八进制。在打开文件后计算其中有多少行和字符后,我正在动态创建数组。

输出:

Abies 
abies 
abietate 
abietene 
abietic 
abietin
\320ѿ_\377Abietineae --> umlaut? where did he come from?
y\300_\377abietineous

代码:

int main(int argc, char ** argv) {

char c = '\0';
FILE * file;
int i = 0, j = 0, max_line = 0, max_char_per_line = 0;

/* get array limits */
file = fopen(argv[1], "r");
while ((c = fgetc(file)) != EOF){
    if (c == '\n'){
        max_line++; j++;
        if (j > max_char_per_line){
            max_char_per_line = j;
        }
        j = 0;
        continue;
    }
    j++;
}

rewind(file);
/* declare array dynamically based on max line and max char */
char word[max_line][max_char_per_line];

/*read in file*/
j = 0; c = '\0';

while ((c = fgetc(file)) != EOF){
    if (c == '\n'){
        word[i][j] = '\0';
        i++; j=0;
        continue;
    }

    word[i][j] = c;
    j++;
}
word[i][j] = '\0';

fclose(file);
for (i = 0; i < max_line; i++){
    printf("%s\n", word[i]);
}



    return 0;
}
4

3 回答 3

8

更改读取例程:

   if (c == '\n'){
        word[i][j] = 0x0;
        i++; j=0;
        continue;
    }

并在 printf 例程中添加“\n”。

for (i = 0; i < max_line; i++){
    printf("%s\n", word[i]);
}

C 字符串以零结尾,而不是“\n”结尾,因此当您 printf() 对它们进行打印时,printf()不知道在哪里停止打印。

于 2012-10-04T17:29:40.430 回答
5

你没有终止你的字符串。您需要在\0每行的最后一个字符之后添加空终止符:。

在您的第一个循环中,为最长的行确定足够的空间,包括换行符。

  • 如果要将换行符保留在输入数组中,只需将 1 添加到max_char_per_line,并在完成第二个循环中的每一行时在换行符后添加空终止符。

  • 如果您不需要输入数组中的换行符,只需将该空间用作空终止符。

于 2012-10-04T17:28:50.140 回答
0

并不是说它准确地解释了你观察到的现象,但它可能。在计算数组边界时,您似乎没有考虑终止零字节。只是++做计算后的 max_char_per_line 。如果不能保证数组是零初始化的,不要忘记添加这个零字节。

编辑:您是在输出之后看到这些行还是在这些输出行中看到这些行?

于 2012-10-04T17:33:12.127 回答