【C语言】字符串输入输出函数 | gets() | fgets() | gets_s() | scanf()

“如果一个字符串读入程序,首先要预留存储该字符串的空间”

目录

gets()函数和puts()函数

fgets()函数和fputs()函数

gets_s()函数

scanf()函数


gets()函数和puts()函数

gets()函数读取整行输入,直至遇到换行符,然后丢弃换行符,存储其余字符,并在这些字符末尾添加一个空字符,使其成为一个C字符串。

#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;
}

【C语言】字符串输入输出函数 | gets() | fgets() | gets_s() | scanf()_第1张图片

但是!!!gets()唯一的参数是数组名words,并不知道数组的长度。

数组名代表数组首元素的地址,因此gets()只知道数组的开始出,并不知道数组中有多少个元素。如果输入的字符串过长会导致缓冲区溢出。

因此,坚决禁止使用gets()

 

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;
}

输出如下: 

【C语言】字符串输入输出函数 | gets() | fgets() | gets_s() | scanf()_第2张图片

输出解释: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个字符或者读到第一个空白停止。

【C语言】字符串输入输出函数 | gets() | fgets() | gets_s() | scanf()_第3张图片

 

你可能感兴趣的:(语言问题C)