这个c语言里,str字符数组已经够大了,为什么后面fgets(str, strlen(str) + 1, fp)还要加1呢,求指教!

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
FILE *fp;
char str[100];
int i = 0;

if ((fp = fopen("test", "w")) == NULL)
{
printf ("can not open file!\n");
exit(0);
}

printf ("input a string:\n");
gets(str);

while (str[i] != '\0')
{
if (str[i] >= 'a' && str[i] <= 'z')
{
str[i] = str[i] - 32;
}

fputc(str[i],fp);
i ++;
}

fclose(fp);
fp = fopen("test", "r");
fgets(str, strlen(str) + 1, fp);
printf ("%s\n", str);
fclose(fp);
return 0;
}

从字面看这是为了从文件中一次性读出的字符个数把str空间填满。因为fgets(str,n,fp);只从文件中一次读取最多n-1个字符,若写strlen(str),那就最多只读取strlen(str)-1个字符,显然少一个字符,填不满str;而写成strlen(str)+1,则一次可读取strlen(str)个字符,刚好把str填满。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-07-12
char *fgets(char *buf, int bufsize, FILE *stream);
从文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'\0'),如果文件中的该行,不足bufsize个字符,则读完该行就结束。如若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续读该行。

也就是说,参数bufsize最大只能读取bufsize-1个字符,如果超过,则不再读取,这是为了保证末尾有位置放\0.为了完整读取len字符,需要将内容长度bufsize>len本回答被提问者采纳
第2个回答  2016-07-12
习惯写法而已,不管他就是了
望采纳,谢谢
相似回答