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 |是为了清晰起见,我这样写的退格字符。 我无法理解为什么显示第二行输出。
答案 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
输出。