将C阵列打印到终端

时间:2012-10-04 17:23:30

标签: c unix

我需要读取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;
}

3 个答案:

答案 0 :(得分: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()不知道在哪里停止打印。

答案 1 :(得分:5)

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

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

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

  • 如果需要输入数组中的换行符,而只是将该空格用于空终止符。

答案 2 :(得分:0)

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

编辑:在输出之后或在这些输出行中看到这些行吗?