C语言关于字符串的输入

一、scanf

       从第一个非空白字符开始读取,直到遇到空白字符为止(不包含空白字符)。

       缺点:
                1. 不能读取空格、制表符,因为被当作“分隔符”处理了!
                2. 可能导致越界。

       比如下面的代码:

#include <stdio.h>

int main()
{
	//把用户名和密码用字符串的方式实现
	char name[16];
		 
	printf("请输入用户名:");
	scanf("%s",name);              //数组名本身就是个地址,不用加取址符&
	
	printf("用户名:%s\n",name);

	return 0;
}                

      这里我们输入用户名:zhang san   输出的结果是:zhang

      56f5c2c035a416f998c2e2ab30bb37c53a9.jpg

      输入的zhang 和 san 之间有空白字符(空格),所以遇到空格停止了!
 

二、gets

      能够读取 空格、制表符,遇到回车符结束,相当于读一行,但是不包括行末的回车符

      缺点:字符串长度不受控制,会导致越界

      比如下面的代码:

#include <stdio.h>

int main()
{
	//把用户名和密码用字符串的方式实现
	char name[8];
		 
		printf("请输入用户名:");
		gets(name);              

		printf("用户名:%s\n",name);

	return 0;
}  

      这里我们输入用户名:zhang san li si  输出的结果是:zhang zhang san li si    

      f02412322deabb5cb9a6d1483a2eb0e924c.jpg

      输入的字符明显超出了定义的8 - 1 = 7(字符串最后是0)个字符的长度,但是并没有提示报错!

 

二、fgets

      fgets会指定字符串的大小,如果超出数组大小,会自动根据定义数组的长度截断。fgets比gets安全,使用gets编译时会警告!

      注意:回车符也被读到字符串(除非输入数据太多)。

      比如下面的代码:

#include <stdio.h>

int main()
{
	//把用户名和密码用字符串的方式实现
	char name[8];
		 
		printf("请输入用户名:");
		fgets(name,8,stdin);        //第二个参数8就是要求的长度,也可以用sizeof(name)表示 

		printf("用户名:%s\n",name);

	return 0;
}  

      我们输入li si(李四),得到的结果如下:

      335b4a47947077d723e671ce60945e4cb17.jpg

      有2次换行,fgets把回车确认输入的回车换行符存入了字符串里:'l'  'i'  ' '  's'  'i'  '/n'  '\0' 一共7个字符。

      如果输入的字符串超出了定义的长度,输出的结果会根据长度进行截断,确定输入结束的回车符 '\n' 没有带到字符串中。

 

fgets函数进阶用法:

      fgets函数用来从文件中读入字符串。fgets函数的调用形式如下:fgets(str,n,fp);  此处,

      str是存放在字符串的起始地址;

      n是一个int类型变量;

      fp是文件指针。

      函数的功能是从fp所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满n-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符。因此,确切地说,调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加'\0',并以str作为函数值返回。
      要去掉fgets()最后带的 '\0',只要用 s[strlen(s)-1]='\0'; 即可。
      fgets不会像gets那样自动地去掉结尾的 '\n',所以程序中手动将 '\n' 位置处的值变为'\0',代表输入的结束。

      针对于fgets,还要再说两句,下面这种用法,是安全的判断文件读取结束或者出错的好方式,切忌不能使用while(!feof(fp)),还有对于fgets的第二个参数是最大能读取文件字符的个数,一般最大的长度是1024字节。

while(fgets(..., stream)){

        /* ... */
}

if(ferror(stream)){

        /* ... */
}

转载于:https://my.oschina.net/u/3979769/blog/2208662

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值