相关疑惑及个人解析
p147
fprintf("error
");
由于fprintf函数会把格式字符串当作一个文件结构来处理,这种情况下很有可能出现内核转储的后果.
疑问:内核转储是什么意思?为什么会造成这种后果?
在UNIX系统中,常将“主内存”(main memory)称为核心(core),因为在使用半导体作为内存材料之前,便是使用核心(core)。而核心映像(core image)就是“进程”执行当时的内存内容。当进程发生错误或收到“信号”而终止执行时,系统会将核心映像写入一个文件,以作为调试之用,这就是所谓的核心转储(core dump)。
头文件:#include <stdio.h>
定义函数:int fprintf(FILE * stream, const char * format, ...);
函数说明:fprintf()会根据参数format 字符串来转换并格式化数据, 然后将结果输出到参数stream 指定的文件中, 直到出现字符串结束(' ')为止。
返回值:关于参数format 字符串的格式请参考printf(). 成功则返回实际输出的字符数, 失败则返回-1, 错误原因存于errno 中.
范例
#include <stdio.h>
main()
{
int i = 150;
int j = -100;
double k = 3.14159;
fprintf(stdout, "%d %f %x
", j, k, i);
fprintf(stdout, "%2d %*d
", i, 2, i);
}
执行:
-100 3.141590 96
150 150
解析:由于sprintf函数将格式字符串当作一个文件结构来处理,导致进程出现错误,进而可能是出现内核转储的后果.sprintf函数的第一个参数必须为一个文件结构.
p157
printf("%*%
",n);
上式将在宽度为n个字符的域内以右端对齐的方式打印一个%符号,先打印n-1个空白字符,后面再跟一个%字符,当n的值为负数时,符号-当作左端对齐的标识符来处理,此时,上述结果应该为一个%符号,后面再跟-n-1个空格.
问题:
上面这个例子在Code::Blocks上运行的结果都为一个%符号,跟上述结果不同.