一、文件IO相关
1、标准出错、输入、输出三者的缓冲机制是什么?
标准出错(stderr):属于不缓冲机制,数据直接写入设备
标准输入(stdin)和标准输出(stdout):属于行缓冲和全缓冲,行缓冲时需要用'\n'分隔,全缓冲是缓冲区满才会写入或者输出。
冲刷缓冲函数:fflush();无论是如果想将全缓冲变成行缓冲,可以在这个输出后添加fflush函数,将其中数据冲刷出来
2、标准输入和标准输出函数及其家族
标准输入:例如下列变量定义(int a;char m;char buf[20],*str;FILE *file;)
函数名 | 函数功能 | 函数使用方法 |
scanf(); | 标准输入,将键盘的值赋值给变量地址 | scanf("%d",&a); |
fgets(); | 输入一个字符串,通过标准输入获取 | fgets(buf,20,stdin); |
getchar(); | 拿走一个字符 | while(getchar()!='\0'); |
fgetc() | 读取一个字符 | fgetc(m); |
getc | 跟fgetc效果相同 | getc(m); |
gets | 跟fgets差不多,已废弃不讨论 | |
fscanf(); | 将文件中的数据按指定格式赋值给变量 | fscanf(file,"%d %s",&a,buf); |
sscanf(); | 将字符串中的数据按指定格式赋值给变量 | sscanf(str,"%d %s",&a,buf); |
标准输出:例如下列变量定义(int a;char m;char buf[20],*str;FILE *file;)
函数名 | 函数功能 | 函数的使用方法 |
printf(); | 标准输出 | printf("hello word\n"); |
puts(); | 用于输出到屏幕上,自带'\n'不需要自己换行 | puts("hello word"); |
fputs(); | 用于将数据输入到文件中,如果需要换行需要手动添加'\n' | fputs("hello word\n",file); |
putc(); | 用于将单个字符写入文件或标准输出,多数用于标准输出 | putc('H',stdout); |
fputc(); | 用于将单个字符写入文件或标准输出,多数用于文件写入 | fputc('H',file); |
fprintf(); | 将指定数据输入到文件中 | fprintf(file,"a %d %s",a,buf); |
sprintf(); | 将指定数据拼接成一个新的字符串,用于字符串拼接 | sprintf(str,"hello %s %d",buf,a); |
dprintf | 非标准库中函数,(不重要) | |
snprintf(); | sprintf()函数的安全版本,多了一个字符控制 | snprintf(str,20,"hello %s %d",buf,a); |
二、数组和指针
1、数组的描述
如何在数组运行时获取数组大小?
答:可以通过sizeof(arr) / sizeof(arr[0])
来计算数组的元素个数,前提arr不是指针
为什么sizeof(arr) / sizeof(arr[0])可以计算数组的元素个数,但这种方法对指针不适用?
答:当arr
是指针时,sizeof(arr)
给出的是指针本身的大小,而不是它所指向的内存区域的大小。
数组名在表达式中通常被当作什么?
答:在大多数表达式中,数组名被当作指向数组首元素的指针。
当数组作为函数参数传递时,实际上传递的是什么?
答:传递的是数组首元素的地址。
C语言中字符串是如何存储的?
以空字符'\0'结尾的字符数组。
2、指针的描述
什么是野指针?如何避免野指针的出现?
答:野指针是指向未知(或无效、未分配、已释放)内存地址的指针。初始化指针、检查指针的有效性、避免指针越界、及时释放内存
请解释指针加1在int型指针和char型指针上分别意味着什么?
答:指针加1意味着指针指向的内存地址向前移动了一定的字节数,在int型指针上向前移动4位,在char型指针上向前移动1个字节数.
给定一个结构体定义,如何通过指针访问结构体的成员?
答:首先需要使用指针指向结构体变量,然后通过->
运算符来访问结构体的成员。
const char *buf;char const *buf;char *const buf;分别描述什么意思?
char const *buf="abst"; | *buf="jdas";错误, buf++;正确 | 不能通过buf 指针来修改它所指向的字符数据,但你可以改变buf 指针本身的值 |
const char *buf="abst"; | ||
char data[]="abst" char *const *buf=data; | *buf="l";正确 buf++;错误 | 不可改变指针但是可以改变值 |