一、背景

当执行下面的程序时,如果输入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()函数的用法相关推荐

  1. 入门C语言第二话:函数(上)之锻体篇,带你玩转函数(内有汉诺塔,青蛙跳台阶等经典问题,建议收藏和分享)

    文章目录 前言 概念的引入 大纲 一.函数的定义 二.函数的分类 1.库函数 概念引入 库函数的分类 了解五步骤 例1: 1.介绍printf 2.头文件 3.所传参数及其类型 4.返回类型及其返回值 ...

  2. 7-2 I Love GPLT (5 分)初用数组————从0学C/浙大pta入门c语言题目

    这道超级简单的题目没有任何输入. 你只需要把这句很重要的话 -- I Love GPLT --竖着输出就可以了. 所谓"竖着输出",是指每个字符占一行(包括空格),即每行只能有1个 ...

  3. 7-20 简单计算器 (20 分)————从0学C/浙大pta入门c语言题目

    模拟简单运算器的工作.假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算. 输入格式: 输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数. ...

  4. c语言fseek128字节,C语言rewind和fseek函数的用法详解(随机读写文件)

    前面介绍的文件读写函数都是顺序读写,即读写文件只能从头开始,依次读写各个数据.但在实际开发中经常需要读写文件的中间部分,要解决这个问题,就得先移动文件内部的位置指针,再进行读写.这种读写方式称为随机读 ...

  5. C语言rewind函数返回值为空,C语言rewind和fseek函数的用法详解(随机读写文件)...

    前面介绍的文件读写函数都是顺序读写,即读写文件只能从头开始,依次读写各个数据.但在实际开发中经常需要读写文件的中间部分,要解决这个问题,就得先移动文件内部的位置指针,再进行读写.这种读写方式称为随机读 ...

  6. python rewind_C语言rewind和fseek函数的用法详解(随机读写文件)

    前面介绍的文件读写函数都是顺序读写,即读写文件只能从头开始,依次读写各个数据.但在实际开发中经常需要读写文件的中间部分,要解决这个问题,就得先移动文件内部的位置指针,再进行读写.这种读写方式称为随机读 ...

  7. eval函数 c语言,matlab中eval函数的用法

    满意答案 eval_r()函数的功能就是将括号内的字符串视为语句并运行 例如: eval_r('y1=sin(2)')就是相当于在matlab命令窗口输入了y1=sin(2)这条命令. 多在循环中使用 ...

  8. c语言输出time函数,C语言time()函数的用法

    https://blog.csdn.net/jaylee123123/article/details/80986913 time()函数的用途是返回一个值,即格林尼治时间1970年1月1日00:00: ...

  9. C语言fscanf和fprintf函数的用法详解

    fscanf() 和 fprintf() 函数与前面使用的 scanf() 和 printf() 功能相似,都是格式化读写函数,两者的区别在于 fscanf() 和 fprintf() 的读写对象不是 ...

  10. C语言sort和qsort函数的用法

          做ACM题的时候,排序是一种经常要用到的操作.如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错.STL里面有个sort函数,可以直接对 ...

最新文章

  1. 网页中如何获取客户端系统已安装的所有字体?
  2. 线程:方法join的使用
  3. Citrix俱乐部 - 您的思杰家园
  4. Echarts多个坐标轴多组/一组数据 - 温度降水量示例
  5. 《去哪网编程题》filename extension
  6. itex将html转成pdf加水印,itext操作PDF文件添加水印
  7. c 结构体在声明时赋值_C/C++编程笔记:C++入门知识,C++多态性和虚函数解析
  8. 启动hive报错_远程服务器模式Hive的搭建过程详解
  9. DAY04 WINDOWS 文件的共享以及FTP服务器的搭建
  10. C++第五章课后习题16-字符串按逆序输出
  11. Nokia Widget 应用开发培训笔记
  12. 数据挖掘原理与实践学习(3)
  13. 3篇SCI定A类博士!直聘副教授七级!有偿70㎡住房+30万安家费+25万科启
  14. weblogic下载及安装
  15. Cortex-M3 (NXP LPC1788)之UART用法
  16. matlab普朗克黑体辐射公式,MATLAB 黑体辐射规律的研究详解.doc
  17. JS校验银行卡号以及通过银行卡号自动带出所属银行信息
  18. 百度网页快照删除服务恢复运营
  19. 10个常用的JS工具库
  20. A type incompatibility occurred while executing org.springframework.boot:spring-boot-maven-plugin:2.

热门文章

  1. 实用的软件安装及使用
  2. 设计房屋租赁管理系统--PostgreSQL--数据库原理及应用
  3. php_curl-5.4.3-VC9-x64下php_curl.dll加载出错
  4. Maven -- dependency详解
  5. UnsatisfiedDependencyException
  6. vim插件介绍(一)之Tabular
  7. 三菱plc pwm指令_2020学员高级电工必须掌握的20个各种PLC设备编程
  8. ffmpeg的简单介绍、用ffmpeg下载blob加工后的视频(m3u8格式)
  9. axios与ajax对比,AjAX 步骤和对比fetch和axios
  10. 差距越来越大, 直播行业割终结束, 虎牙、斗鱼平分天下?