C——字符输入函数

scanf("%s",name1);

作用:只是说上面这个函数形式,从屏幕中读入字符串,把字符串地址给name1,这个函数更像是单纯读一个单次,因为它从第一个非空白字符开始读入,然后碰到第一个空白字符停止(如空格,换行符,制表符),我用的也不会那么深,就这么稍微说说

参数:%s是转换说明,在s前面加数字即可以限制读入的数目,如%5s,%10s

返回值:返回读入的项数,或者读到文件结尾或读入失败返回EOF

注意:VS上使用这个函数会报错说不安全,因为它无法保证输入大小不会超过存储容量,可能造成内存泄漏

gets(name1);

作用:从屏幕中读入字符串

参数:只有一个存放字符串的地址参数

返回值:未知

特点:可以读取一整行输入,不像scanf遇到空格就停止,当然它也跟scanf一样无法保证内存泄漏;遇到换行符会舍弃,会加上空字符(太多数输入函数应该都会吧),

puts(name1);

gets经常和puts搭配使用,puts会在输出的字符串后面加上换行符

 

name2给的长度很小,为了测试内存泄漏 

上图所示应该是内存泄漏的警告 

fgets(name1,n,stdin);

作用:书上说它一般用来处理文件输入,如果要从键盘读取,那第三个参数写stdin(标准输入)

参数:主要说下n,n限制读入的字符个数,fgets最多读入n-1个字符,预留一个给空字符

返回值:会返回传入字符串的指针,读到文件结尾或读入失败会返回NULL空指针

特点:可以防止内存泄漏;与gets不同,它会把换行符读进来 ,很多时候我们是不想要这个换行符的比如比较字符串的时候,待会会说怎么去除它;

fputs(name1,stdout);

与fgets搭配使用的字符串输出函数,它不会在字符串后面加个换行符,它的第二个参数是标准输出,应该跟fgets一样是专门处理文件的

上面把fgets的返回值作为puts的参数,结合下图可以说明fgets的返回值是输入的字符串指针 

 

上图中第一个是键盘输入的字符串,下面一个是puts输入的,最后一个是puts输出name1,第二和第三中间空了一行就是因为fgets存储了换行符 

接下来介绍一下用于fgets的换行符处理函数,和用于大多数输入函数的多于字符处理函数

 

图书蓝色虚影部分就是消除换行符的主要代码 

 

第三句可以看出确实消除了换行符 

下图是消除输入的多余字符

没有消除函数

 

有消除函数 

 

 

如果用fgets来输入字符串,还可以做到空行离开

 

 

 gets_s(name1,n);

作用:字符串输入函数,C11新增

参数:同样可以限制读入的数目,可以读入n-1个字符

返回值:如果输入长度超过容量会返回空指针

特点:会舍弃换行符,这个函数会在内存泄漏时异常终止,显得更安全,但是如果不想让程序异常终止这个函数还得要搭配处理函数,比如判断返回值是不是 NULL空指针,并要求重新输入(这个我也不知道咋写处理函数,好像没我说的那么简单,VS会直接给我报错)

 综上所述,我们可以自己设计一个字符串输入函数,可以限制大小,抛弃换行符,返回指针,消除多余字符

mygets(name1,n);

char* mygets(char* str, int n)
{
	char* ret_val;
	ret_val = fgets(str, n, stdin);
	int i = 0;
	if (ret_val)
	{
		while (str[i] != '\n' && str[i] != '\0')
			{
				i++;
			}
			if (str[i] == '\n')
				str[i] = '\0';
			else
				while (getchar() != '\n');
	}
	return ret_val;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值