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


int index = 0;
FILE *fptr;
fptr = fopen("File.txt", "w");
char arr[] = {'A', 'b', 'B', 'b', 'C', 'b', 'b', 'n'};
while(arr[index] != ''){  
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'};

在数组的末尾没有附加明确的CCD_ 1。所以,

while(arr[index] != '')

在错误前提下运行并访问超出绑定的内存。它调用未定义的行为。

引用C11,第6.7.9章

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

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

字符类型的数组可以由字符串文字或UTF−8字符串初始化文字,可选地用大括号括起来。字符串文字的连续字节(包括如果有空间或数组大小未知,则终止null字符)初始化数组的元素。

因此,

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

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

最后一个数组元素的值是n。所以不是

while(arr[index] != '')

你应该使用

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

请注意,您的代码中没有''数组终止符。但是如果你定义这样的阵列

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

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

最新更新