1 gets/fgets函数
char* fgets(char *restrict buf,int n,FILE *restrict fp)
参数1:存放读入串的缓冲区
参数2:表示读入的字符个数,最大值不能超过缓冲区的长度,遇到N为止,如果读到N-1个字符仍让没有读到' ' 那么只读入n-1个字符,最后一个字符用来放入' ';
注意:fgets会把' '也放入到缓冲中 所以实际上的字符为n-1个
char* gets(char *buf)
返回值:
成功读入一行,返回缓冲区的首地址
出错返回NULL
gets和fgets类似,不将' '放入到缓冲区
gets的漏洞:函数的缓冲区由用户提供,但是无法指定一次最多读入多少字节的内容,所以很危险
1.1 演示gets的漏洞
在ubuntu14.04 直接不让用gets() 警告危险
1 #include <stdio.h> 2 int main(void) 3 { 4 /* 这个缓冲区已经很大了,如果用户输入是在命令行方式下的话,该缓冲的空间是足够的 */ 5 char buf[2048]; 6 while(gets(buf) != NULL){ /* 从屏幕读入一行字符串 */ 7 printf("%s ", buf); /* 并且将该字符串显示输出到屏幕上 */ 8 } 9 return 0; 10 }
注意:屏幕简单的输入和输出都不会出现问题 因为默认1024个字节 当一个比较大的时候 就会出现段错误
2puts/fputs:向标准输出字符串
注意:gets函数不读入' '但是puts会输出' '
推荐使用fgets和fputs
3 3按照行也读:通常配置文件都是需要这样来处理+正则表达式
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #define MAX_LINE 1024 5 int main(void) 6 { 7 char buf[MAX_LINE]; /* 缓冲区 */ 8 FILE *fp; 9 int len; 10 if((fp = fopen("test.txt", "r")) == NULL){ /* 打开文件 */ 11 perror("fail to read"); 12 exit(1); 13 } 14 while(fgets(buf, MAX_LINE, fp) != NULL){ /* 每次读入一行 */ 15 len = strlen(buf); 16 /* 输出所读到的字符画串,并将字符个数输出 */ 17 buf[len - 1]='