C primer程序示例append.c中append函数为什么要指定数量,函数处理后的结果怎么传出函数的?

题目说的问题主要就是s_gets()函数参数中的n。设置SLEN是为了限制输入文件名的长度,将SLEN设置为80后,函数的实参n=80,因此在使用fgets时最多只读取80个字符,并赋值给ret_val。

参数怎么传出函数的呢?通过char* 类型的指针变量ret_val作为返回值传出。

问题描述:

在主程序中调用s_gets()函数时并没有接收这个函数返回值,怎么回事??主程序中接着直接使用了file_app的值,在使用前并没有看到有什么语句会改变它的值呀?也就是说在此之前它是没有被赋值的呀!怎么直接用了?

解答:

1. 字符数组本质是一个字符指针变量。

2.据我们所知,指针变量时可以穿透函数,直接改变它的值,而不用靠接受return返回的值。

3. 这里传入的实参file_app是一个指针变量(字符数组)

4. s_gets()函数中语句 ret_val = fgets(st, n, stdin); fgets直接把标准输入(用户键盘输入)存到了形参st中,也就是给到了实参file_app。同时也将结果赋值给了ret_val作为函数返回值。

char* s_gets(char* st, int n)
{
	char* ret_val;
	char* find;
	ret_val = fgets(st, n, stdin);
	if (ret_val)
	{
		find = strchr(st, '\n');
		if (find)
			*find = '\0';
		else
			while (getchar() != '\n')
				continue;
	}
	return ret_val;
}

主程序节选:

#define SLEN 81 /*13.4 reverse.c程序  和  append.c程序 */
//
#define BUFSIZE 4096 /* append.c程序 */

int main(void)
{
	FILE* fa, * fs;// fa指向目标文件,fs指向源文件
	int files = 0;
	char file_app[SLEN]; //目标文件名
	char file_src[SLEN]; //源文件名
	int ch;
	puts("Enter name of destination of file");
	s_gets(file_app, SLEN);
	if ((fa = fopen(file_app, "a+") )== NULL)
	{
		fprintf(stderr, "Can't open %s\n", file_app);
		exit(EXIT_FAILURE);
	}
	return 0;

}

一开始没想明白,于是我增加了一条输出语句来调试看看 ,结果如下。返回值符合预期,file_app仿佛被返回值赋值了。

fgets()函数在遇到EOF时将返回NULL值,可以利用这一机 制检查是否到达文件结尾;如果未遇到EOF则返回传给它的地址。 

 

tips:

1. 该程序获取文件名所用的函数是 s_gets(),而不是 scanf(),因为 scanf() 会跳过空白,因此无法检测到空行。该程序还用s_gets()代替fgets(),因为后者在字符串中保留换行符。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值