分配空间
假设编写如下的代码
char *name ;
scanf("%s",name);
warning:读入name时,name可能会擦写程序中的数据会代码,从而导致程序异常终止,此时的参数name是个未初始化的指针
最简单的的方法是,在声明显式指明数组的大小
char name [81];
不幸的gets() 函数
gets() 函数读取整行输入,直至遇到换行符,然后丢弃换行符,储存其余字符,并在这些字符末尾添加一个空字符使其成为一个C的字符串
char words[40]; gets(words);
问题 gets() 函数唯一的参数是words,它无法检查数组能否装得下输入行
C11 直接从标准中废除gets() 函数
fgets() 函数
fgets() 函数的第二个参数指明了读入字符的最大数量 如果该参数是n,那么该函数读入N—1个字符,或者读到遇到的第一个换行符为止
如果fgets() 函数读到一个换行符,会把它存储在字符串中
fgets() 函数的第三个参数指明要读入的文件。如果读入从键盘输入的数据,则以 stdin (标准输入)作为参数
缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续读该行。函数成功将返回的地址与传入的第一个参数相同,失败或读到文件结尾返回NULL。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。

s_gets() 函数
char *s_gets(char *st, int n) { char *ret_val; int i=0; ret_val = fgets(st,n,stdin); if (ret_val) // 即,ret_val != NULL { while(st[i] !='\n' && sr[i] != '\0') i++; if(st[i] == '\n') st[i]=='\0'; else while(getchar() != '\n') continue; } return ret_val; }
如果fgets() 返回NULL,说明读到文件结尾或出现读取错误
丢弃过长输入行中的余下字符,输入行中多出来的字符会被留在缓冲区,成为下一次读取语句的输入。丢弃输入行余下的字符保证了读取语句与键盘输入同步
s_gets() 函数 最严重的缺陷是遇到不合适的输入毫无反应,丢弃多余的字符时。既不通知程序也不告知用户
字符串输出
puts()函数只需把字符串的地址作为参数传递给它即可,puts()函数在输出的末尾添加换行符
fputs()函数的第2个参数指明要写入数据的文件 如果要打印在显示器上,可以定义在stdio.h 的stdout(标准输出)作为该参数
fputs()函数不会再输出的末尾添加换行符,与fgets()函数配套使用