c语言字符串多了1024,C语言关于字符串的输入

一、scanf

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

缺点:

1. 不能读取空格、制表符,因为被当作“分隔符”处理了!

2. 可能导致越界。

比如下面的代码:

#include

int main()

{

//把用户名和密码用字符串的方式实现

char name[16];

printf("请输入用户名:");

scanf("%s",name); //数组名本身就是个地址,不用加取址符&

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

return 0;

}

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

b9e63fd904376fd7efb0c77e5df5effd.png

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

二、gets

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

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

比如下面的代码:

#include

int main()

{

//把用户名和密码用字符串的方式实现

char name[8];

printf("请输入用户名:");

gets(name);

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

return 0;

}

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

f12c4e9aa44137ce88d3a4852a5f5518.png

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

二、fgets

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

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

比如下面的代码:

#include

int main()

{

//把用户名和密码用字符串的方式实现

char name[8];

printf("请输入用户名:");

fgets(name,8,stdin); //第二个参数8就是要求的长度,也可以用sizeof(name)表示

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

return 0;

}

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

499aa11e23a7c5f3113e2d5245566a2f.png

有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)){

/* ... */

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值