前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C字符串输入注意事项

C字符串输入注意事项

原创
作者头像
九问
修改2021-09-18 17:13:28
1.1K0
修改2021-09-18 17:13:28
举报
文章被收录于专栏:C语言学习C语言学习

字符串输入函数

下面介绍几种常用的字符串输入函数,以及它们使用的相关不足之处

## scanf()函数

初学者学习C语言时,第一次遇到的字符串输入函数可能就是scanf了,当我们敲会车的时候停止输入。然而,它也有一些缺陷,而这些缺陷有时候是非常致命的。比如说当我们输入scanf("%5s %10s",str1,str2);,然后再打印printf("the string1 is %4s and the string2 is %5s",str1,str2)其中str1,str2是长度为10的char类型数组,当我们输入的值是**zifuchuan shuru**,它会不会打印出**zifuchuan shuru**呢?答案是不会的,这也是使用scanf()函数要注意的地方,打印的时候因为转换格式是%4s,所以它只读入了**zifu**,然后遇到%5s后将**chuan**读入。后面的**shuru**如果不清除,它会在下一次调用时读取,这样下一次读取时会读不到我们想用的字符串,如果下一次输入的不是字符串甚至可能会导致程序错误。然后scanf还有一个缺陷就是只能读取一个单词,不能读取有空格的句子。

## gets()函数

gets()函数简单易用,比如下面的一段代码

代码语言:txt
复制
char words[100];

gets(words);

我们输入一段话比如**you are a good boy**,它会将这一段全部读取进去,包括空格,直到遇到换行符停止输入,然后在末尾添加'\n'空字符使这段话成为字符串。gets()简单易用的同时,也有着严重的缺陷,同样拿我上面那段代码来做说明,words数组的长度限制为100个元素,每个元素是char类型的字符,最后一个元素是空字符,所以实际上我们只能输入99个字符,当我们输入的字符超过99时,也就是说多余的字符没有预留的空间,后果就是buffer overflow,如果只是占用为使用的内存空间还好,如果它占用的是其他进程的空间,那么会导致程序异常中断。gets()在我们输入超出的字符时是不会提醒我们的。因此C11从标准中废除了gets()函数,当然为了兼容以前的代码,大部分编译器仍然继续支持着。

## fgets()函数

fgets()第一个参数是char str,也就是指针,指向chat类型,一般是存储字符串的地址,第二个参数是读入字符的最大数量,第三个则是FILE stream,指明要读入的文件,一般我们从键盘读取时,以stdin作为参数。因为fgets()限制了字符数量,所以避免了buffer overflow,另外,fgets()在输入不溢出的情况下会将换行符也存储进去,所以配合fputs(),它会自动换行。fgets()函数会返回指向char的指针,顺利读取时返回的地址与第一个相同,如果到了文件结尾,则会返回null pointer,

常见错误

未给字符串分配空间

对于下面一段代码,

代码语言:txt
复制
char *name;

printf("%s\n",name);

那么这段代码的问题在哪呢?我们定义了指向char类型的指针,然后它并没有进行初始化,name存储的是指向哪里的地址?他可能就随便存储了,而且内存并未为其分配空间。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 字符串输入函数
  • 常见错误
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com