首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我的代码出了什么问题?为什么gets函数不工作?

"我的代码出了什么问题?为什么gets函数不工作?"

首先,关于代码出现问题的原因可能有很多种,我会尝试给出一些常见的可能性和解决方案。

  1. 输入缓冲区溢出:gets函数在读取输入时没有指定输入缓冲区的大小,这可能导致输入超过缓冲区大小而发生溢出。这是一个安全隐患,因为它可能导致缓冲区溢出攻击。为了解决这个问题,可以使用更安全的函数替代gets,比如fgets函数,它可以指定输入缓冲区的大小。
  2. 输入包含特殊字符:如果输入中包含特殊字符,如换行符或制表符,gets函数可能会出现问题。这是因为gets函数会将这些特殊字符作为输入的一部分,并且会在遇到换行符时停止读取。为了解决这个问题,可以使用其他函数来读取输入,比如scanf函数或fgets函数,并且在处理输入之前进行适当的验证和过滤。
  3. 输入流被重定向:如果输入流被重定向到文件或其他地方,gets函数可能无法正常工作。这是因为gets函数默认从标准输入流中读取输入。为了解决这个问题,可以使用其他函数来读取输入,比如fgets函数,并且指定正确的输入流。
  4. 编译器警告或错误:如果编译代码时出现警告或错误,可能会影响到gets函数的正常工作。编译器警告或错误可能是由于代码中其他部分的问题引起的,需要仔细检查并修复。

总结起来,gets函数不工作可能是由于输入缓冲区溢出、输入包含特殊字符、输入流被重定向或编译器警告或错误等原因导致的。为了解决这个问题,可以使用更安全的函数替代gets,如fgets,并且进行适当的输入验证和过滤。此外,还需要检查代码中是否存在其他问题,如编译器警告或错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么同样代码就是跑起来,同事却能跑起来?

不知道小伙伴们有没有遇到过标题问题,明明同样一套代码,在自己本地就是运行起来,或者说在本地只改了一个无关痛痒代码,看上去人畜无害,结果就报各种乱七八糟错误,但是同事却能运行好好。...这种情况下其实你们代码版本是不一样,并不是标题提到一样代码,但是很多时候自己内心会以为代码是一样。...还有一种情况就是自己本地的确实改动了部分代码,但是改动地方看上去是人畜无害,但是就是跑起来。...这种情况下如果回滚掉这段人畜无害代码过后能正确运行,那么不要怀疑,就是这段看上去人畜无害代码导致。...总结 反正跑起来肯定有原因,不是代码原因就是环境原因,一般经过上面几个方式排查,都能找到问题了,如果再不行,重新查询拉取代码库也未尝不是一个方法,当然如果实在解决不了,咨询前辈也是一个很有效方法。

1.3K30

C语言入坑指南-缓冲区溢出

比如,对于gets函数: char buff[255]; gets(buff); 我们不会知道用户在控制台会输入多少字符,但是可以肯定是,输入字符很有可能会超过255,甚至字符中包含了可以执行代码字节编码...因此我们不应该使用像gets这样不安全函数,而选择fgets这样可替代函数。查看gets函数手册发现,手册中甚至直言不讳地说道:Never use gets()。...作用 推荐使用函数 推荐使用函数 拷贝字符串 strcpy strncpy 字符串比较 strcmp strncmp 字符串连接 strcat strncat 格式化字符串并存入缓冲区 sprintf...snprintf 读取字符串 gets fgets 复制字符串 strdup strndup 字符串比较忽略大小写 strcasecmp strncasecmp 其中推荐使用函数特点是,限定了操作内容大小...而有些时候并不一定有更加安全函数可替代,这种时候,我们需要自己特别关注。 思考 以下代码什么问题: char buff[10]; strcpy(buff,"0123456789");

1.7K30

C语言缓冲区之 gets(str);fflush(stdin); rewind(stdin);setbuf(stdin, NULL);

可是执行程序后会发现出了问题:当从键盘输入一个字符后,就打印出了结果,根本就没有输入第二个字符程序就结束了。例如用户输入字符’a’, 打印结果是97,10。这是为什么呢?...其实这里10恰好是回车符!这就是为什么这个程序只执行了一次输入操作就结束原因! 【解决办法】: 清空缓冲区残留数据。...其实还有更简单方法,即使用 gets() 函数。该函数原型为: include char *gets(char *str); 这个函数很简单,只有一个参数。...gets() 函数功能是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向内存空间。...也就是说: gets(str); 完全可以取代: scanf("%s", string); 不仅代码更简洁,而且可以直接输入带空格字符串。

2.7K31

小议缓冲区溢出

这里代码提出来,代码如下: #include int main(int argc, char* argv[]) { int apple; char buf[...代码 gets() 函数是接收用户输入函数,但是它不对内存边界进行检查。buf[9] 长度为 9 个字节,但是当使用 gets() 函数获取用户输入时,当超过 9 个字节时,也会全部接收。...等等,代码中 apple == 0x64636261,看起来 apple 比较是 dcba,但是为什么输入是 abcd 呢?...这个是字节顺序问题,这里展开讨论,只要了解了字节序问题,就可以理解了,而字节序在开发网络程序和进行逆向分析时,也算是基础基础。...演示 这个程序,使用 XP + VC6 来进行演示。为什么使用 VC6,因为在新版 VS 中,已经没有 gets 函数了,因为它不安全,所以被丢弃了。

91330

C语言:字符数组输入输出

大家好,又见面了,是你们朋友全栈君。 目录 用printf输出 用scanf输入 用gets输入 用puts输出 ---- 用printf输出 输出方法1:printf 逐个字符输出。 ...注:只要遇到空白字符就结束输入,空白字符包括空格、tab、enter 用gets输入 gets(字符数组) 从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组起始地址。...一般利用gets函数,目的是向字符数组输入一个字符串,而不关心其函数值。 ...如果输入字符串过长,会导致缓冲区溢出(buffer overflow),即多余字符超出了指定目标空间。...下面这一段呢,是根据自己之前做一些工作,见下面。 自己小疑虑:输入8个字符,为什么不把最后两个’\0’输出呢?

4.5K10

很“迷”字符与字符串

大家好o(*^▽^*)┛,是呆博~很开心又和大家见面啦~ 最近一直在为自己浏览量而担忧啦,都快被厂长大人约谈了……真的有尽力在写稿子哦,所以也请各位老铁,如果觉得文章还不错就转发到朋友圈或者微信群之类...如下面的代码所示,大家可以想一下输出结果会是什么? ? 输出结果为:身高是-86厘米!。 这是为什么呢?...除此之外还打印输出了字符串中首位和末位字符,实验结果如下图所示 ?...3 C语言三种输入函数 下面介绍 C 语言中三种标准输入函数scanf(),getchar()和gets()。 ?...读取字符串时: (1) scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后回车符; (2) gets()以Enter结束输入(空格结束),接受空格,会舍弃最后回车符!

1.2K20

Innodb_buffer_pool_read_requests探究之路

只限于大学时候学过c语言,而且毕业到现在也快5年了,基本上也都还给老师了。工作时候,一般使用也都是python。还好语言都是互通,搭配注释,还能看懂个大概。...调试了好几次,被淹没在了各种不认识函数和语法当中爬不出来,这条路暂时是走不通了,就算走通,估计也要非常久了。 换一条路,直接全局搜索n_page_gets,在涉及到该值计算函数都打上断点。...但是为什么多次调用呢,而且似乎和行数有一定关系呢。这个时候就需要查看上游到底是什么再调用这两个函数了。...猜想是使用limit时候知道需要几行,所以innodb去获取时候就知道需要调用几次。...但是其他语句都是不知道要返回几行,需要全表扫描,那么等到全部行获取完成后还需要再调用一次,判断还有没有剩。最后一次general_fetch函数返回值也证实了猜测。

95740

C语言字符串IO

问题: 问题在于gets唯一参数就是数组名,它无法检查数组是否装得下输入行,数组名会被转换成该数组首元素地址,因此gets函数只知道数组开始处,如果输入字符串过长,会导致缓冲区溢出,及多余字符超出了指定内存空间...C11标准中新增gets_s函数也可以代替gets函数,该函数gets函数很接近,而且可以替换现有代码gets函数。...分析: gets函数抛弃\n,puts函数添加\n,fgets函数保留\n,fputs函数添加\n 第一行输入中:apple pie比fgets函数读入整行输入短,因此apple pie\n\0被存储在了数组中...注意fgets函数会保留出入末尾换行符作为字符串一部分,要编写额外代码将其替换成空字符,但是只要输入行未超过最大字符数,gets_s和gets函数几乎一样,完全可以用gets_s函数替换gets。...这是因为输入行中多出来字符会被留在缓冲区中,成为下一次读取语句输入, 我们设计s_gets()函数并不完美,缺陷:遇到不合适输入时毫无反应,它丢弃多余字符时既不通知程序也告诉用户。

4.5K10

基础知识 | 每日一练(114)

基础知识练习 士人有百折不回之真心,才有万变穷之妙用。...——菜根谭 学生:为什么大家都说不要使用 gets()? 小林:gets()跟 fgets() 不同, gets() 不能被告知输入缓冲区大小, 因此不能避免缓冲区溢出。...标准库 fgets() 函数gets() 作了很大改进, 尽管它仍然不完善。如果真的可能输入很长行, 还是需要仔细思考, 正确处理,用 fgets() 代替 gets() 代码片断。...读者:为什么调用 printf() 之后 errno 内有 ENOTTY? 小林:如果 stdout 是终端, 很多 stdio 包都会对其行为进行细微调整。...注意, 只有当函数报告错误之后检查 errno 内容才有意义。errno 在其它情况下也不保证为 0。

2693029

Vue 中,如何将函数作为 props 传递给组件

上已经收录,更多往期高赞文章分类,也整理了很多文档,和教程资料。欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 Vue 新手经常问一个常见问题。...为什么?Vue有更好东西。 大家都说简历没项目写,就帮大家找了一个项目,还附赠【搭建教程】。 React vs Vue 如果使用过 React,就会习惯传递函数方式。...因此,尽管在Vue中可以把函数作为prop传递,但它被认为是一种反模式。 使用事件 事件是我们与 Vue 中父组件通信方式。 这里有一个简短例子来说明事件是如何工作。...这使我们代码更简洁,并从长远来看避免了许多令人头痛问题。 但是有时候我们可能会试图通过函数来绕过这个问题。...---- 代码部署后可能存在BUG没法实时知道,事后为了解决这些BUG,花了大量时间进行log 调试,这边顺便给大家推荐一个好用BUG监控工具 Fundebug。

7.6K20

2018春招总结

,在构造函数那里复制一份,注意这里是值复制,如果外部类修改了值,内部类却不会修改,Java为了避免数据不同步问题,做出了匿名内部类只可以访问final局部变量限制  这个链接讲不错:内部访问外部类变量为什么需要...)   自我介绍      介绍工作室团队      当小组长经历      tcp握手挥手,为什么      线程生命周期      io原理      集合相关hashmap,set...工作招新过程      在工作室招新过程中,是怎么准备      一天规划      怎么学习      BAT为什么选择腾讯      未来3-5年职业规划      有没有女朋友...      家里情况      为什么选择Android这个方向      为什么选择腾讯mig部门      有什么问题要问我    华为(春招)   接下来是华为面试,华为面试也是现场面试...(16位)      大小写转换怎么设计局限于英文,包括法文等等      java泛型      java为什么要采取泛型擦除这种方式实现泛型      java作者是谁    总结

1.1K50

MIT 6.858 计算机系统安全讲义 2014 秋季(一)

一些政策检查工具可以帮助,但需要一种指定不良内容方法。 在分布式系统中很困难:不知道每个人在做什么。 出了什么问题 #2:威胁模型/假设问题 例子: 未考虑人为因素。...为什么程序员会写出这样代码? 旧代码,未暴露在互联网上。 程序员没有考虑安全性。 许多标准函数曾经是不安全(strcpy,gets,sprintf)。...,而 C 希望让你尽可能接近硬件) 攻击还利用了关于 x86 代码如何工作架构知识: 栈增长方向 栈变量布局(尤其是数组和函数返回地址) read_req.c: void...Q: 为什么要检测strcpy()和memcpy()? A: 否则,这些函数就是未经检测代码,并且会遇到我们刚刚讨论过相同问题。...创建了一个特殊统计文件,/sysx/stat。 给了/sysx/fort“家庭文件许可证”(类似于关于/sysx setuid) 出了什么问题

13310

【水一篇】骚操作之net 6winform启动同时启动Net 6 WebApi【同一套代码

首先呢,为什么会有这么一个问题,是在一个QQ群里,有看到有人提问,能不能在启动Winform同时去启动一个Web服务器去监听请求然后去做相应业务处理,同时也可能存在和Winform之间交互,然后也闲来无事...方法或者GetContext方法可以获取到我们请求HttpListenerContext上下文对象,里面包含了我们请求信息,以及后续要写入Response信息,从而实现一个Webapi手段;排除有人手撕...不过提这个问题倒没有看他是否要求是fw版本还是net6,所以我在Net6基础上实现了一个,我们都知道,不管是Winform程序还是net6Web程序,都是有一个Program类去启动程序或者Web...程序,至于页面没有测试,不过应该也开始可以Program整体代码如下 <PropertyGroup...,让能水一篇博客,哈哈。

1.3K21

再谈协程之suspend到底挂起了啥

在协程中,有个不成文约定,那就是,suspend函数默认是阻塞线程,也就是说,suspend函数调用者,不用为suspend函数运行在哪个线程而担心,suspend函数会自己处理它工作线程,不大部分时候...❞ 这段代码是不完整,因为不同状态没有办法分享信息。编译器会在函数中使用相同Continuation对象来做这件事。这就是为什么Continuation泛型是Any?...❝免责声明:注释不是由编译器生成添加它们是为了解释它们作用,并使跟随代码更容易理解。 ❞ fun loginUser(userId: String?, password: String?...现在你知道了编译器在编译时到底做了什么,你就可以更好地理解为什么一个suspend函数在它执行完所有工作之前不会返回。...另外,你也会知道,代码是如何在阻塞线程情况下进行suspend——这是因为,当函数恢复时需要执行信息被存储在Continuation对象中!

89510

『C语言』字符串输入gets()和输出puts()

于是C语言还提供了两个对字符串进行操作函数。 puts()字符串输出函数gets()字符串输入函数。...而printf()函数不会这样。 下面我们用代码来演示下代码示例如下↓ ​#include int main(void) { puts("yysyCyuyanyyds!")...遇到结束符时候后面字符便不会再输出了。...经过调试后光标直接换到下一行('\n')当中去。 ③.gets()字符串输入函数 字符串输入可以使用gets()函数,作用是将读取字符串保存至形式参数当中去。...下面代码来演示下,它们最主要区别如下↓功能:实现strlen()功能(统计长度) 首先是用scanf()函数如下↓ ​​​​#define _CRT_SECURE_NO_WARNINGS 1 #include

2.2K30

大数据技术周报第 006 期

2、gzip 在 hadoop 中不会分割 http://www.it1352.com/541051.html 图片 对比 Storm,为什么选择 Flink 引擎?...在使用 Storm 开发时处理逻辑与实现需要固化在 Bolt 代码。...Flink 则可以通过 SQL 进行开发,代码可读性更高,逻辑实现由开源框架来保证可靠高效,对特定场景优化只要修改 Flink SQL 优化器功能实现即可,而不影响逻辑代码。...4、阿里巴巴高级技术专家章剑锋:大数据发展 8 个要点 笔者从 2008 年开始工作到现在也有 11 个年头了,一路走来都在和数据打交道,做过大数据底层框架内核开发(Hadoop,Pig,Tez,Spark...一直不太喜欢张口闭口讲“大数据”,更喜欢说“数据”。因为大数据本质在于“数据”,而不是“大”。

23920

干货 | 从资深软件工程师学到避坑大法

如果忘记了这部分代码,之后又回到了代码工作上,没有注释的话不能重新创建上下文,可能只会想:「为什么他们要这么写?这没有任何意义……哦,等等,是。」 这里就是开发文档和注释该出现地方。...尝试基于已有代码进行工作,但是资深工程师会尝试解决掉它——全部删除。一个永远无法到达 if 声明?一个不应该调用函数?是的,都消失了。 至于我呢?只会把函数写在最上面。...认为测试是一种文档,是对代码假设文档。测试会告诉(或之前的人)他们预想代码是如何工作,以及他们预期哪里会出错。 所以,当写测试时,我会记住: 记录如何使用测试时用到类/函数/系统。...在你集群中出现一台「垮掉」机器也应当是同样做法——在试图找出机器出了什么问题之前,先把它停了,并标记它不可用。...如果不知道 bug 在哪就不能修改错误。其中一种最糟糕感觉是从客户那里知道有 bug。 「做了什么?!甚至不知道系统出了什么问题?」

55620

gets 、getchar 、fgets 、scanf用法

很显然,对蠕虫病毒实现来说, gets 函数功劳不可小视。不仅如此,GCC 也推荐使用gets和puts函数。   ...如下面的示例代码所示: int main(void) { char buffer[11]; gets(buffer); printf("输出: %s\n",buffer); return 0; } 示例代码运行结果为...: aaa 输出: aaa   根据运行结果,当用户在键盘上输入字符个数大于缓冲区 buffer 最大界限时,gets 函数也不会对其进行任何检查,因此我们可以将恶意代码多出来数据写入堆栈。...示例代码运行结果为: aaaaaaaaaaaaaaaa 输出: aaaaaaaaaa   除此之外,C99 还提供了 fgets 函数宽字符版本 fgetws 函数,其函数一般原型如下面的代码所示...如果第一次输入时候超过了10个字符(其中没有按回车键).   那么在第一次回车后会显示两个字符串内容,第一次输入多于10个字符保存到了第二个字符数组中。   请问这是为什么

2.9K60
领券