由入门C语言题目浅析gets()函数的用法

59 篇文章 1 订阅
订阅专栏

一、背景

当执行下面的程序时,如果输入ABC,则
知输出结果是()
#include<stdio.h>
#include<string.h>
int main()
{
char ss[10] = “1,2,3,4,5”;
gets(ss);strcat(ss,“6789”);
printf("%s\n",ss);
return 0;
}

在逛论坛的时候遇到了如上的一个问题,目测应该是二级题库或者水平考试的题目,
题目本身不难,我也顺手给坛友回复了自己的看法:
在这里插入图片描述
没曾想这个问题还没有结束…

在这里插入图片描述
那么该怎么科学认识gets()这个函数呢?

二、曲径探幽

1. 贫穷的困扰

根据学Python学Java的经验,遇到问题,最简单的解决办法是查阅官方文档。

让我们来找找C语言的官方文档;
在这里插入图片描述
哦?
在这里插入图片描述
点进去看看
在这里插入图片描述
在这里插入图片描述
贫穷是阻碍不了我们追求知识的,
既然没有免费的官方标准文档,
我们也不到处去找一些第三方文档了,
让我们自己来分析一下子(要找也能找到,主要是为了引入下一段分析源码)
<本文发表于CSDN博客, 由入门C语言题目浅析gets()函数的用法,https://blog.csdn.net/ftimes/article/details/106957922,转载请注明出处>

2. 奋斗本身是一种幸福

大大教育我们:“幸福是奋斗出来的,奋斗本身是一种幸福。”

虽然没有文档,但是我们可以看看网上免费的一些教程有个大概了解

在这里插入图片描述
有了这个文档,我们对gets有了大概了解,

下面我们需要自己奋斗一下,把握gets的一些特性

还是用刚刚的例子

在这里插入图片描述
在这里插入图片描述
可以看到,读入了一个新字符串之后,ss的地址是没有变的,并不是指向了一个新的字符串,
那么问题又来了,
abc是明显覆盖不了ss[10]的,那么其他位置的元素去哪里了呢?

我们来改一下代码:
用了一下C++,所以需要加点头文件

#include <bits/stdc++.h>
#include <iostream>
using namespace std;

#include<stdio.h>
#include<string.h> 
int main()
{
        char ss[10] = "12345";
        
        cout<<"org ss is :"<< &ss << endl;

        gets(ss);

        cout<<"now ss is :"<< &ss << endl;

        for (int i = 0; i < 10;++i)
        {
                cout << ss[i] ;
        }
        cout << endl;
        //strcat(ss,"6789");
        //printf("%s\n",ss);
        return 0;
}

输入abc,输出结果如图
在这里插入图片描述
在本来该存放“12345”的内存区域,变成了“abc 5”

看到这里,也许有朋友会问,不应该是"abc45"吗,为什么莫名多了一个空格?

当年学C的时候,学校老师就叮嘱我们一定要注意C-type字符串的结束符 ‘\0’
‘\0’标志着一个字符串的结束,
让我们输出一下’\0’的ASCII码验证一下

末尾加一行代码:

printf("%d", ss[3]);

在这里插入图片描述

自信输出ACII码为0,\0为占位符无疑

在这里,我们再来验证一下,字符数超过char ss[10]的情况

#include <bits/stdc++.h>
#include <iostream>
using namespace std;

#include<stdio.h>
#include<string.h> 
int main()
{
        char ss[10] = "123456789";
        
        cout<<"org ss is :"<< &ss << endl;

        gets(ss);

        cout<<"now ss is :"<< &ss << endl;

        for (int i = 0; i < 10;++i)
        {
                cout << ss[i] ;
        }
        cout << endl;
        //strcat(ss,"6789");
        //printf("%s\n",ss);
         printf("%d", ss[3]);
        return 0;
       
}

需要注意的是,由于需要一个结束符占位,所以ss[10]只能存到1-9
在这里插入图片描述
起始地址不变,原数组被覆盖。

三、总结一下

C-type的字符串ss,其实只是一个首地址,
我们用gets()输入数据,其实就是从字符串不断叠加,通过换行符终止之后,gets就自动加个’\0’标志字符串结束。
输出的时候,系统也是不断的顺着首地址读,读到结束符为止。

所以:

  1. 覆盖了原数据;
  2. 不受原数组大小限制;
  3. 不会指向一个新地址;

其实gets与scanf相比还有一些不同的特性,这里暂且不表,
表达能力有限,
祝大家端午安康,天天开心吧~!

在这里插入图片描述
感觉有用请点个赞哦~

C语言-gets函数
qq_40286155的博客
03-20 3万+
gets函数 gets函数原型:char *gets(char *str) 功能:从stdio流中读取字符串直到遇到换行符或者EOF时停止,并将读取的结果存放在str指针所指字符数组中换行符不作为读取内容 ,读取的换行符被转换为NULL值 并由此结束字符 即:gets函数用来从标准输入设备读取字符串直到遇到回车,但是回车不属于字符串 系统自动用’\0’代替换行符作为字符串的结束标志 ==>...
计算机编程语言 | C 语言浅析
weixin_43932460的博客
04-08 2595
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。海风教育退费 海风教育在线辅导0元一对一试听课等你来领取,领取课程方法: 1、私信留下您的手机号和姓名,需要补习的科目。 2、也可以在海风教育官网留下您的手机号领取 https://www.hfjy.com 尽管C语言提供了许多低级...
函数gets()的用法
农夫阿才
09-24 8万+
gets()函数和scanf()对比 先看代码: #include&amp;amp;amp;amp;lt;stdio.h&amp;amp;amp;amp;gt; int main(void){ char a1[10], a2[10],a3[10]; scanf( &amp;amp;amp;quot;%s%s&amp;amp;amp;quot;,a1,a2); //gets(a2); gets(a3); puts(a1); puts(a2); puts(a3); /
gets()函数的运用
2302_79344985的博客
11-02 3074
并且使用 gets() 时,系统会将最后“敲”的换行符’\n‘从缓冲区中取出来,然后丢弃,所以缓冲区中不会遗留换行符。这就意味着,如果前面使用过 gets(),而后面又要从键盘给字符变量赋值的话就不需要吸收回车清空缓冲区了,因为缓冲区的回车已经被 gets() 取出来扔掉了。可以看出,我们在使用scanf时,第一次输入一个字符后,我们敲出了换行的行为,'\n'就被存入了缓冲区,相当于第二次输入字符时,输入的时'\n'. 所以我们要用getchar() 清空缓冲区。以上这是使用了gets()。
字符串gets函数详解
weixin_30294709的博客
12-30 3177
在前面从键盘输入字符串是使用 scanf 和 %s。其实还有更简单的方法,即使用 gets() 函数。该函数的原型为: 1 #include <stdio.h> 2 char *gets(char *str); 这个函数很简单,只有一个参数。参数类型为char*型,即str可以是一个字符指针变量名,也可以是一个字符数组名。 gets() 函数的功能是从输入缓冲区中读取一...
gets函数的使用
一个一般人发现不了的博客
05-03 2万+
2.gets 函数——输入字符串函数     其一般形式为     gets ( 字符数组 ); 其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。如执行下面函数:     gets ( str );                                                     //str 是已定义的字符数组     从
浅析栈溢出原理
najdhdfh的博客
10-20 1万+
函数的调用 准备工具: linux系统 调试工具gdb gdb插件:pwndbg 关于pwndbg插件可以在github搜索并下载安装,需要python环境 工具准备好之后,来看一段简单的代码,我们将通过调试分析这段简单的代码来理解函数在被调用前后都做了哪些操作. #include<stdio.h> int add(int a, int b){ return a + b; } int main(){ int num = add(1,2); printf("resu
Android智能指针浅析
Android Fans
06-23 5226
长久以来,C++中的内存管理问题一直让人头疼,空指针,野指针,内存泄露。。。。。。C++程序员看到这样的问题就是各种头大!这样的问题往往很难解决,尤其是代码架构比较庞大或者复杂的时候。但是同样是面向对象的JAVA语言却没有这个问题,为什么呢?因为java有GC,也就是垃圾回收而C++没有。C++的做法是:程序员必须做到在new一个对象之后当不需要使用它的时候必须delete这个对象。看来很好,没有问
浅析linux printk的实现
jeffreyst的专栏
08-17 2746
printk函数是我们调试linux内核必备的打印接口, printk定义在/kernel/路径下 声明在/linux/kernel.h中,如果在某个文件中使用printk时编译通不过,通常都是未包含这个头文件(当然还有语法错误,呵呵~) /**  * printk - print a kernel message  * @fmt: format string  *
C标准库函数浅析
luojungang的专栏
06-05 4533
使用C语言的一半价值在于使用其标准库函数。当然,灵活的for循环以及数组和指针之间的相似性也是C语言的重要价值。在解决实际问题时,能方便地操作字符串和文件等对象是最重要的,有些语言能出色地完成其中的一部分工作,另一些语言能出色地完成其中的另一部分工作,然而,没有几种语言能象C语言那样能出色地完成全部工作。  c标准库中还缺少很多函数,例如投有图形函数,甚至没有全屏幕文本操作函数,signal机制也
gets()函数
Asuei的博客
03-03 3万+
gets()函数 1.描述 C 库函数 char *gets(char *str) 从标准输入 stdin 读取一行,并把它存储在 str 所指向的字符串中。当读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。 gets(str) 约等于 scanf("%s",&str) 会把读到的字符串写入数组,但又不同。 2.区别 scanf("%s",&str) :读到空格便停止。 gets(str) :一直读到敲回车(不管中间是否有空格)。 (区别2) 这里顺便提一下printf() 和
C语言gets雨scanf函数用法
weixin_30807779的博客
04-18 208
/*1.不同点: scanf不能接受空格、制表符Tab、回车等; 而gets能够接受空格、制表符Tab和回车等; 2.相同点: 字符串接受结束后自动加'\0'。 使用scanf("%s",&s);函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止*/ ...
gets函数C语言gets函数详解
热门推荐
abc
08-24 14万+
gets函数C语言gets函数详解 在前面从键盘输入字符串是使用 scanf 和 %s。其实还有更简单的方法,即使用 gets() 函数。该函数的原型为: # include <stdio.h> char *gets(char *str); 这个函数很简单,只有一个参数。参数类型为 char* 型,即 str 可以是一个字符指针变量名,也可以是一个字符数组名。 gets() 函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间。 下面将前面中使用 scanf
c语言gets()的详细用法
deng0004的博客
09-09 1万+
gets从标准输入设备读字符串函数。可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。 从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为‘\0’空字符,并由此来结束字符串。 读入成功,返回与参...
C语言gets( )函数详解
qq_48460693的博客
08-25 7576
gets()函数
gets()函数的使用
最新发布
2301_80832060的博客
04-05 414
首先定义两条DNA序列相同位置的碱基为一个碱基对,如果一个碱基对中的两个碱基相同的话,则称为相同碱基对。接着计算相同碱基对占总碱基对数量的比例,如果该比例大于等于给定阈值时则判定该两条DNA序列是相关的,否则不相关。为了获知基因序列在功能和结构上的相似性,经常需要将几条不同序列的DNA进行比对,以判断该比对的DNA是否具有相关性。需要在将scanf("%lf",&m)写成scanf("%lf\n",&m)但若与scanf一起使用时,若scanf()没有加\n,便会报错,如。gets(),用于输入字符数组。
关于C语言gets()函数
ding7530的博客
07-20 433
  看这里就好了:     1.https://www.quora.com/Why-is-it-unsafe-using-gets-in-C-C++     2.https://stackoverflow.com/questions/1694036/why-is-the-gets-function-so-dangerous-that-it-should-not-be-used   ...
C语言字符串输入函数gets(),fgets(),get_s())
2301_80224556的博客
03-01 2702
如果一切进行顺利,该函数返回的地址与传入的第1个参数相同。
《C和指针》笔记6:gets/puts/scanf/printf/getchar/getline函数用法
subtitle_的博客
08-26 2237
《C和指针》笔记6:gets/puts/scanf/printf/getchar函数用法
C语言入门gets函数详解与示例
在实际编程中,理解C语言的基础知识和`gets()`函数用法是至关重要的。同时,需要注意安全问题,例如使用`fgets()`代替`gets()`来避免缓冲区溢出。`fgets()`函数允许指定要读取的字符数,从而更安全地处理用户输入...
写文章

热门文章

  • 雷神笔记本FN功能快捷键大全 38987
  • 梯度爆炸与梯度消失是什么?有什么影响?如何解决? 32542
  • 「学习笔记」torchvision.datasets.MNIST 参数解读/中文使用手册 28911
  • AI三大主义:符号主义、联结主义、行为主义 28121
  • nn.Sequential和nn.Module区别与选择 28104

分类专栏

  • Note 59篇
  • 杂记 43篇
  • 基础题库 6篇
  • tricks 44篇
  • pytorch 18篇
  • AI 12篇
  • 算法 11篇
  • OpenCV 25篇
  • CSP 15篇
  • Python 23篇
  • dataStructure 2篇
  • Data 1篇
  • digital image processing 3篇
  • C++ 23篇
  • Java 1篇

最新评论

  • MinGW-W64 x86_64-win32-seh 蓝奏云下载链接

    小飞侠也会emo: 伸手党向您鞠躬,好人一生平安

  • PyTorch如何获取当前的学习率Learning Rate(lr)

    .吃月亮的人.: optimizer.param_groups[0]['lr']

  • 【总结】PyTorch多分类log_softmax、softmax的中文手册

    江南蜡笔小新: 是的 logSoftmax+NllLoss是常用的做法,可能是当时看差了,已更正

  • 【总结】PyTorch多分类log_softmax、softmax的中文手册

    YANGN1: 说反了吧,现在softmax下面是这句This module doesn’t work directly with NLLLoss, which expects the Log to be computed between the Softmax and itself. Use LogSoftmax instead (it’s faster and has better numerical properties).

  • [小技巧]怎么把电脑PC微信通知声调小?单独调整电脑微信音量

    侯咕咕: very 感谢,我耳朵都快被吵聋了表情包

大家在看

  • Leetcode 每日一题:Diameter of Binary Tree

最新文章

  • -tf.reduce_sum(one_hot_labels * log_probs, axis=-1)是什么损失函数?
  • tf1.x和tf2.x查看TFRecord数据的方法
  • tensor(): argument ‘dtype‘ must be torch.dtype, not torch.tensortype
2022年10篇
2021年71篇
2020年133篇
2019年1篇
2017年9篇

目录

目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家洛阳玻璃钢雕塑加工厂河池玻璃钢雕塑用途上海欧式玻璃钢雕塑批发上海高质量玻璃钢雕塑内蒙古玻璃钢雕塑灯厂家包头广场玻璃钢雕塑商场美陈万圣玻璃钢雕塑曲阳厂家丽江市玻璃钢雕塑设计要多少钱铜陵街道玻璃钢花盆瓦房店玻璃钢雕塑厂河源玻璃钢不锈钢雕塑云南标识标牌玻璃钢景观雕塑鹤壁专业不锈钢玻璃钢雕塑厂家昭通玻璃钢雕塑厂家直销玻璃钢卡通牛雕塑批发钦州玻璃钢座椅雕塑公司郴州玻璃钢雕塑制作厂家镜面校园玻璃钢景观雕塑报价晋城玻璃钢人物动物不锈钢雕塑盐城玻璃钢海豚雕塑厂家海陆空军玻璃钢雕塑吉安玻璃钢花盆云南玻璃钢花盆价格吉林火烈鸟玻璃钢雕塑定制玻璃钢仿铜雕塑视频成都多彩玻璃钢雕塑哪家便宜佛山透光玻璃钢雕塑抚州环保玻璃钢雕塑广西玻璃钢美国队长雕塑生产厂家香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化