C语言涉及问题(文件IO与数组和指针)

一、文件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++;错误

不可改变指针但是可以改变值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值