按行输入
下列函数用来输入一行:
从标准输入读取一行,s存放输入内容的缓冲区的首地址,并没有指定缓冲区的大小,如果用户输入超出缓冲区的大小,很容易溢出。
- char * gets(char *s); //不建议使用,有可能引起缓冲区溢出
通过一个指定的流stream,读取一行字符串,保存到S指向的缓冲区,指定缓冲区的大小。
- char *fgets(char *s,int size,FILE *stream);
(1) 成功时返回s,到文件末尾或出错时返回NULL;
(2) gets 不推荐使用,容易造成缓冲区溢出;
(3) 遇到'\n'或已输入size-1(字符串以\0结尾的)个字符时返回,总是包含‘\0’;
tps:在C语言中,'\0'是空字符,用作字符串的结束符
fgets - 示例#define N 6char buf[N];
fgets(buf,N,stdin);
prinft("%s",buf);
假设键盘输入分别是:abcd<回车> abdcef<回车> buf中的内容是?
按行输出
下列函数用来输出字符串:
puts、fputs仅把缓冲区的字符串写到流里面,至于字符串是否包含换行符,无所谓,一直输出直到遇到结束符('\0'),结束符不写到流里面。
int puts(const char *s); //默认只能向标准输出流使用
int fputs(const char *s,FILE *stream);
- 成功时返回输出的字符个数;出错时返回EOF;
- puts将缓冲区s中的字符串输出到stdout,并追加'\n';
- fputs将缓冲区s中的字符串输出到stream
fputs-示例:打印“hello word”之后,追加‘\n’符光标移动到下一行。FILE *fp;
char buf[] = "hello world";
if((fp = fopen(argv[1],"a")) == NULL)
{perror("fopen");return -1;
}
fputs(buf,fp);
练习
如何统计一个文件文件包含多少行?
1、fgetc?判断是不是换行符'\n',多少个换行符就有多少行,效率低。
2、fgets?一次读取一行,但是遇到size-1,也会返回,所以并不能保证每次读取是完整一行。那么如何保证他读取的是一行呢?判断存放内容的buff,结束符('\0')的前一个位置是否是'\n'。
strlen(buf):计算buf的长度,长度是结束符的下标,如果有换行符结束符的前一个位置。