题目说的问题主要就是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(),因为后者在字符串中保留换行符。