解释fprintf()在程序中的奇怪行为,在文件中打印一些不寻常的字符

时间:2016-05-23 20:15:25

标签: c file io printf

int index = 0;
FILE *fptr;
fptr = fopen("File.txt", "w");

char arr[] = {'A', '\b', 'B', '\b', 'C', '\b', '\b', '\n'};

while(arr[index] != '\0'){  
    fprintf(fptr, "%c", arr[index++]);
}

此处从文件中获取的输出是

A|BS|B|BS|C|BS||BS|
hDC2¦v

| BS |是为了清晰起见,我这样写的退格字符。 我无法理解为什么显示第二行输出。

3 个答案:

答案 0 :(得分:7)

使用括号括起的初始化列表(如

)初始化数组时
 char arr[] = {'A', '\b', 'B', '\b', 'C', '\b', '\b', '\n'};

数组末尾没有附加明确的\0。所以,

 while(arr[index] != '\0')

在虚假场所运行并访问超出范围的内存。它调用undefined behavior

引用C11,章节§6.7.9

  

如果初始化未知大小的数组,则其大小由索引最大的数组决定   具有显式初始化程序的元素。数组类型在其末尾完成   初始化列表。

另一方面,使用字符串文字初始化数组会自动将空终止符放在最后,如本章所述

  

字符类型数组可以用字符串文字或UTF-8字符串初始化   文字,可选择括在括号中。字符串文字的连续字节(包括   如果有空间或数组大小未知,则终止空字符。初始化   数组的元素。

所以,

  • 添加\0作为初始化列表
  • 的最后一个元素
  • 或者,自己计算有效条目数,例如使用sizeof(arr)/sizeof(arr[0])或类似条件。

答案 1 :(得分:0)

while(arr[index] != '\0')替换为while(index < sizeof(arr)/sizeof(char))

答案 2 :(得分:0)

最后一个数组元素的值是\n。而不是

while(arr[index] != '\0')

你应该使用

while(arr[index] != '\n')

注意代码中没有'\0'数组终止符。但是如果你像这样定义数组

char arr[100] = {'A', '\b', 'B', '\b', 'C', '\b', '\b', '\n'};

然后未明确定义的未使用元素将设置为0并且代码将起作用,包括newline输出。