“若是一个字符串读入程序,首先要预留存储该字符串的空间”
目录数组
gets()函数和puts()函数
gets()函数读取整行输入,直至遇到换行符,而后丢弃换行符,存储其他字符,并在这些字符末尾添加一个空字符,使其成为一个C字符串。blog
#include
char *gets( char *str );
puts()函数显示字符串,并在末尾添加换行符,成功返回非负值,失败返回EOF。puts(words)至关于printf("%s\n",words)字符串
#include
int puts( char *str );
/*示例程序*/
#include
int main()
{
char s[100];
gets(s);
puts(s);
return 0;
}
可是!!!gets()惟一的参数是数组名words,并不知道数组的长度。get
数组名表明数组首元素的地址,所以gets()只知道数组的开始出,并不知道数组中有多少个元素。若是输入的字符串过长会致使缓冲区溢出。io
所以,坚定禁止使用gets();class
fgets()函数和fputs()函数
该函数专门用于处理文件输入。
fgets()函数的第2个参数指明了读入字符的最大数量。若是该参数是n,那么fgets()读入n-1个字符,或者遇到第一个换行符为止。若是fgets()函数读到一个换行符,会把换行符存储在字符串中(和gets()区别)。
fgets()函数的第3个参数指明要读入的文件。若是是从键盘输入,将stdin(标准输入)做为参数。
fgets()函数返回指向char的指针。若是正常读入,返回的地址和传入的第1个参数相同。若是读入异常,返回空指针(C语言中用宏NULL来表示)
#include
char *fgets( char *str, int num, FILE *stream );
fputs()函数,它不会在末尾添加换行符。若是是从屏幕输入,将stdout(标准输出)做为参数。
#include
int fputs( const char *str, FILE *stream );
/*循环读入用户输入的内容,直至fgets()读到文件结尾*/
#include
while(fgets(words,10,stdin)!=NULL)
/*示例输出程序*标准输入输出*/
#include
int main()
{
char s[100];
fgets(s,100,stdin);
fputs(s,stdout);
return 0;
}
输出以下:
输出解释:fgets()一次读入“Hello World!”并存储为“Hello World!\n”
接着fputs()打印该字符串,而且未换行。
如何处理掉换行符?
遍历字符串,遇到换行符,并将其替换成空字符。遇到空字符,就丢弃输入行剩余的字符。
为何要丢弃过长输入行中的余下字符?
输入行中多出来的字符会被留在缓冲区中,成为下一次读取语句的输入。
/*读取整行输入并用空字符代替换行符,或者读取部分输入,并丢弃其他部分*/
char * s_gets(char *st,int n)
{
char *ret_val;
int i=0;
ret_val = fgets(st,n,stdin);
if(ret_val!=NULL)
{
while(st[i]!='\n' && st[i]!='\0')
i++;
if(st[i]=='\n')
st[i]='\0';
else
while(getchar()!='\n')
continue;
}
return ret_val;
}
gets_s()函数
gets_s()只从标准输入中读取数据,因此不须要第三个参数。而且gets_s()读到换行符会丢弃它而不是存储它。
若是gets_s()读到最大字符数都没有读到换行符,会执行如下几步。首先把目标数组中的首字符设置为空字符,读取并丢弃随后的输入直至读到换行符或者文件结尾,而后返回空指针。接着,调用依赖实现的“处理函数”,可能会停止或退出程序。
以上的特性说明,只要输入行未超过最大字符数,gets_s()和gets()几乎如出一辙,彻底能够替换!
scanf()函数
scanf()有两种方法肯定输入结束:%5s,读取5个字符或者读到第一个空白中止。