专栏首页C语言学习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()函数简单易用,比如下面的一段代码

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,

常见错误

未给字符串分配空间

对于下面一段代码,

char *name;

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

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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C字符串输出注意事项

    对于初学者来说,字符串输出一般都是输出到显示器上。刚开始接触的输出函数就是printf()了,它是stdout,刚开始学习的时候它的作用是提示还有打印结果,看看...

    九问
  • C++字符数组的输入输出 | 原样输出字符串

    cyuyan这6个字符在内存中存储时,后面会自动加一个结束符'\0',输出时,逐个输出字符直到遇到结束符\0为止。

    小林C语言
  • C++字符串输入函数小结

    看了网上有人写的,不是很全,而且还有几处错误,所以自己重新找了一下MSDN中的相关内容。

    用户7886150
  • Python字符串格式化常用手段及注意事项

    砸漏
  • 64位内核第七讲.内核中字符串编程注意事项

    在内核中.我们的字符有 char类型的.也有wchar_t类型的.分别是宽字符 跟窄字符.但是这种都不建议使用了.而内核提供了两个新的结构体让我们使用 分别...

    IBinary
  • c语言入门教程–-15字符串的输入与输出

    字符串的输入 方法1: scanf(“%s”,&a); 方法2: gets(a);

    全栈程序员站长
  • C++字符串输入输出以及复合类型浅谈

    ch_1和ch_2都是char字符数组,但是ch_2拥有字符串特有的\0,所以ch_2也被称为字符串,而ch_1由于没有\0,所以不能成为字符串。 想要使...

    花狗Fdog
  • 第08期:有关 MySQL 字符集的注意事项

    创建数据库时,显式指定字符集和排序规则,同时,当切换到当前数据库后,参数 character_set_database,collation_database 分...

    爱可生开源社区
  • “default关键字”与“序列化传输”的注意事项

    注:此乃“流水帐”式的水文,营养成分较低,高手请自动无视以下内容,否则引起消化不良等症状等,一概不管 ^_^ c#自从3.0开始,提供了很多便捷的语法特性(俗称...

    菩提树下的杨过
  • C++随记(一)---字符串数组的输入问题

    首先来看一段程序: #include<iostream> using namespace std; int main(){ char name[10],s...

    TeeyoHuang
  • C语言---递归反向输出任意长度的字符串

    (该字符串可以包含空格和回车!) 【题目要求】 编写一个递归函数,实现将输入的任意长度的字符串反向输出的功能。 例如输入字符串:ABCD,输出字符串...

    谙忆
  • C++ 中字符串标准输入的学习及实验

    声明:下面实验中[]里面表示要输入里面的符号,[]符号本身并未输入 1、cin>> cin使用空白(空格、制表符、回车)来确定字符串的结束位置。 cin会将换行...

    用户1215536
  • 连续多行输入--C++ 中字符串标准输入的学习及实验(续篇)

    编程中常常会用到连续多行输入的情况,如果事先知道要输入多少行的话,可以直接定义一个变量,然后用循环就可以实现了,但有时候事先并不知道,要输入多少行,于是就可以用...

    用户1215536
  • C语言在嵌入式系统编程时的注意事项

    C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程...

    企鹅号小编
  • STM32的串口通信

    在基础实验成功的基础上,对串口的调试方法进行实践。硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中。

    用户7678152
  • stm32之串口通信

    在基础实验成功的基础上,对串口的调试方法进行实践。硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中。

    用户6754675
  • stm32中的串口通信你了解多少

    在基础实验成功的基础上,对串口的调试方法进行实践。硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中。

    用户6754675
  • Python入门

      在这章中,我了解到了计算机的概念、Python的发展史以及Python语言的版本之间的区别,并自己安装了Python的编辑器。通过安装Python编辑器,我...

    py3study
  • [GO语言基础] 三.变量声明、数据类型、标识符及编程练习

    作为网络安全初学者,会遇到采用Go语言开发的恶意样本。因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识;另一方面是分享与读者,希...

    Eastmount

扫码关注云+社区

领取腾讯云代金券