c语言gets函数
函数gets的原型为:char*gets(char*buffer);
在 stdio.h中定义,如果要程序中用到此函数需包含#include<stdio.h>
gets()函数用来从标准输入设备(键盘)读取字符串直至接受到换行符或EOF时停止结束,并将读取的结果存放在buffer指针所指向的字符数组中,但换行符会被丢弃,然后在末尾添加'\0'字符。
The line consists of all characters up to and including the first newline character ('\n'). gets then replaces the newline character with a null character ('\0') before returning the line. In contrast, the fgets function retains the newline character. _getws is a wide-character version of gets; its argument and return value are wide-character strings.
-----from msdn
调用格式为:gets(s); 其中s为字符串变量(字符串数组名或字符串指针)。
返回值:读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发生错误,返回NULL指针。所以在遇到返回值为NULL的情况,要用ferror或feof函数检查是发生错误还是遇到EOF。
gets(s)函数与 scanf("%s",s) 相似,但不完全相同,使用scanf("%s",s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。
注意:本函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。为了避免这种情况,我们可以用fgets()来替换gets()。
宽字符版本,当使用unicode宽字符文本时,使用这个函数 _getws();
【百科查阅】
注意编译的时候这段警告信息:
warning C4996: 'gets': This function or variable may be unsafe. Consider using gets_s instead. To disable deprecation,use _CRT_SECURE_NO_WARNINGS. See online help for details.
贴子中的一段代码,也粘到这里看下了
- #include <stdio.h>
- int main ()
- {
- char string[100];
- int i,num=0,word=0;
- char c;
- gets(string);
- for (i=0;(c=string[i])!='\0';i++) //这里为什么不能使'\n'了???
- {
- if (c==' ')
- word=0;
- else if(word==0)
- {
- word=1;
- num++;
- }
- }
- printf ("there are %d words in this line .\n",num);
- return 0;
- }
上述理论中msdn中的一段正好说明了这个知识点:
The line consists of all characters up to and including the first newline character ('\n'). gets then replaces the newline character with a null character ('\0') before returning the line.
--------------------------------------------------------------
- #include <stdio.h>
- int main(void)
- {
- char buffer[21]; //20 chars + '\0'
- gets(buffer);
- //danger :there is no way to limit the number of characters
- printf("You input was %s\n",buffer);
- system("pause");
- return 0;
- }
这段代码中无法保证缓冲区是否足够大会引起溢出而出错。
----------------------------------------------------------
下面这段测试代码当输入空串按回车()不能正常的结束循环。
- #include <stdio.h>
- int main(void)
- {
- char buffer[256];
- while(gets(buffer)!=NULL)
- {
- puts(buffer);
- }
- return 0;
- }
原因在于while(gets(buffer)!=NULL),要使结束循环,需要gets调用失败。
gets返回值是一个指针,也就是输入字符串的地址,而NULL不等于空字符串,也不等于空字符串的地址。
换成下面这条语句:
- while(strcmp(gets(buffer),"")!=0)
或者使用下面这段代码
- char buffer[256];
- gets(buffer);
- while(strlen(buffer)!=0)
- {
- puts(buffer);
- gets(buffer);
- }
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
c语言gets函数的更多相关文章
- C语言pow函数编写
C语言pow函数编写 #include<stdio.h> double chaoba(double f,double q); //声明自定义函数 void main(void) { dou ...
- C语言-自定义函数
C语言自定义函数 --1-- 自定义函数定义 1.1 无参无返回值函数 1.2 无参有返回值函数 1.3 有参无返回值函数 1.4 有参有返回值函数 --2-- 函数的参数 2.1 形式参数介绍和使用 ...
- C语言printf()函数:格式化输出函数
C语言printf()函数:格式化输出函数 头文件:#include <stdio.h> printf()函数是最常用的格式化输出函数,其原型为: int printf( char ...
- C语言的函数
"函数"在英文的翻译是"function",无论在自然科学还是计算机科学都是这个词,而"function"的本意是"功能" ...
- c语言main函数返回值、参数详解(返回值是必须的,0表示正常退出)
C语言Main函数返回值 main函数的返回值,用于说明程序的退出状态.如果返回0,则代表程序正常退出:返回其它数字的含义则由系统决定.通常,返回非零代表程序异常退出. 很多人甚至市面上的一些书籍,都 ...
- Go语言示例-函数返回多个值
Go语言中函数可以返回多个值,这和其它编程语言有很大的不同.对于有其它语言编程经验的人来说,最大的障碍不是学习这个特性,而是很难想到去使用这个特性. 简单如交换两个数值的例子: package mai ...
- 【学习笔记】【C语言】函数
一. 什么是函数 任何一个C语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”.所以,你可以说C语言程序是由函数构成的. 比如你用C语言编写了一 ...
- 【转载】 c语言inline函数的使用
c语言inline函数的使用 转载自:http://blog.chinaunix.net/uid-21843265-id-3056446.html 大学在教科书上学习过inline函数,定义为inli ...
- 【C语言】函数和自定义函数
函数,我之前也提到过一点点内容.其实函数是很好理解的,但是写起来又十分麻烦. 一. 函数引入 我们知道,C源程序是由函数组成的.请看下面的简单函数例子 #include <stdio.h ...
- c语言中函数的简单介绍
c语言中函数的介绍: 函数,简单的说就是代码的打包.存放在一个地方,当需要的时候调用. 函数分类: 1.无参无返回值函数 void func() 2.无参有返回值函数 int func() 3.有参 ...
随机推荐
- 使用script打开页面
<script src="x" onerror=javascript:window.open("http://192.168.38.1/csrf.html" ...
- Tiled and Unity
https://www.mapeditor.org https://assetstore.unity.com/packages/tools/integration/tiled-to-unity-172 ...
- rpc中的注册中心
使用模板模式,对注册中心进行设计,可以方便后续添加注册中心 模板抽象类,提供注册中心必要的方法. public abstract class ServiceRegistry { //这是一个模板的抽象 ...
- [MRCTF]Web WriteUp
和武科大WUSTCTF同时打的一场比赛,最后因为精力放在武科大比赛上了,排名13 - -Web题目难度跨度过大,分不清层次,感觉Web题目分布不是很好,质量还是不错的 Ez_bypass 进入题目得 ...
- [BUUOJ记录] [GXYCTF2019]Ping Ping Ping
主要考察RCE的防护绕过,感觉考的还是比较全的 先构造Payload: ?ip=127.0.0.1;ls 看到目录下有两个文件,fuzz一下发现过滤了 空格 / + * ? { } ( ) [ ]等符 ...
- [BUUOJ记录] [SUCTF 2019]CheckIn
比较经典的一道文件上传题,考察.user.ini控制解析图片方式 打开题目给出了上传功能,源代码里也没有任何提示,看来需要先测试一下过滤 前后依次提交了php,php5,php7,phtml拓展名的文 ...
- ASP.NET Uploadify 上传文件过大 报错(http error)借鉴,以防忘记
Uploadify上传文件原来很早之前用过,没发现什么问题.今天再使用过程中,当文件大于30M的时候就会报错404.查看错误消息提示配置最大上传太小了.需要修改. 记得原来配置上传文件大小在这里:&l ...
- python - 模块调用
基础 调用模块常见的两种方法 import [模块名] from [模块名] import [属性/方法] 进阶用法 调用父级目录下模块 背景介绍 目录new2(b2.py)调用上级目录new1(b1 ...
- 关于json序列化相关代码
自己写的一个 /// <summary> /// 序列化JSON,返回string /// </summary> /// <param name="dt&quo ...
- JumpServer 架构浅解
Jumpserver 是一款由python编写开源的跳板机(堡垒机)系统,实现了跳板机应有的功能.基于ssh协议来管理,客户端无需安装agent.完全开源,GPL授权 设计思路 设计一个跳转网关,所有 ...