gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:19:52 24 4
gpt4 key购买 nike

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

最佳答案

当您使用大括号括起来的初始化程序列表初始化数组时,例如

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

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

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

在错误的前提下运行并访问超出范围的内存。它调用undefined behavior .

引用 C11,第 §6.7.9 章

If an array of unknown size is initialized, its size is determined by the largest indexed element with an explicit initializer. The array type is completed at the end of its initializer list.

另一方面,使用字符串文字初始化数组会自动将空终止符放在末尾,正如该章中提到的

An array of character type may be initialized by a character string literal or UTF−8 string literal, optionally enclosed in braces. Successive bytes of the string literal (including the terminating null character if there is room or if the array is of unknown size) initialize the elements of the array.

所以,要么

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

关于c - 解释一下程序中fprintf()的奇怪行为,在文件中打印一些不寻常的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37399748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com