函数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的情况,要用ferrorfeof函数检查是发生错误还是遇到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.

贴子中的一段代码,也粘到这里看下了

  1. #include <stdio.h>
  2. int main ()
  3. {
  4. char string[100];
  5. int i,num=0,word=0;
  6. char c;
  7. gets(string);
  8. for (i=0;(c=string[i])!='\0';i++)                  //这里为什么不能使'\n'了???
  9. {
  10. if (c==' ')
  11. word=0;
  12. else if(word==0)
  13. {
  14. word=1;
  15. num++;
  16. }
  17. }
  18. printf ("there are %d words in this line .\n",num);
  19. return 0;
  20. }

上述理论中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.

--------------------------------------------------------------

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. char buffer[21];  //20 chars + '\0'
  5. gets(buffer);
  6. //danger :there is no way to limit the number of characters
  7. printf("You input was %s\n",buffer);
  8. system("pause");
  9. return 0;
  10. }

这段代码中无法保证缓冲区是否足够大会引起溢出而出错。

----------------------------------------------------------

下面这段测试代码当输入空串按回车()不能正常的结束循环。

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. char buffer[256];
  5. while(gets(buffer)!=NULL)
  6. {
  7. puts(buffer);
  8. }
  9. return 0;
  10. }

原因在于while(gets(buffer)!=NULL),要使结束循环,需要gets调用失败。
gets返回值是一个指针,也就是输入字符串的地址,而NULL不等于空字符串,也不等于空字符串的地址。
换成下面这条语句:

  1. while(strcmp(gets(buffer),"")!=0)

或者使用下面这段代码

  1. char buffer[256];
  2. gets(buffer);
  3. while(strlen(buffer)!=0)
  4. {
  5. puts(buffer);
  6. gets(buffer);
  7. }
    1. <pre></pre>
    2. <pre></pre>
    3. <pre></pre>
    4. <pre></pre>
    5. <pre></pre>

c语言gets函数的更多相关文章

  1. C语言pow函数编写

    C语言pow函数编写 #include<stdio.h> double chaoba(double f,double q); //声明自定义函数 void main(void) { dou ...

  2. C语言-自定义函数

    C语言自定义函数 --1-- 自定义函数定义 1.1 无参无返回值函数 1.2 无参有返回值函数 1.3 有参无返回值函数 1.4 有参有返回值函数 --2-- 函数的参数 2.1 形式参数介绍和使用 ...

  3. C语言printf()函数:格式化输出函数

    C语言printf()函数:格式化输出函数 头文件:#include <stdio.h> printf()函数是最常用的格式化输出函数,其原型为:     int printf( char ...

  4. C语言的函数

    "函数"在英文的翻译是"function",无论在自然科学还是计算机科学都是这个词,而"function"的本意是"功能" ...

  5. c语言main函数返回值、参数详解(返回值是必须的,0表示正常退出)

    C语言Main函数返回值 main函数的返回值,用于说明程序的退出状态.如果返回0,则代表程序正常退出:返回其它数字的含义则由系统决定.通常,返回非零代表程序异常退出. 很多人甚至市面上的一些书籍,都 ...

  6. Go语言示例-函数返回多个值

    Go语言中函数可以返回多个值,这和其它编程语言有很大的不同.对于有其它语言编程经验的人来说,最大的障碍不是学习这个特性,而是很难想到去使用这个特性. 简单如交换两个数值的例子: package mai ...

  7. 【学习笔记】【C语言】函数

    一. 什么是函数 任何一个C语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”.所以,你可以说C语言程序是由函数构成的. 比如你用C语言编写了一 ...

  8. 【转载】 c语言inline函数的使用

    c语言inline函数的使用 转载自:http://blog.chinaunix.net/uid-21843265-id-3056446.html 大学在教科书上学习过inline函数,定义为inli ...

  9. 【C语言】函数和自定义函数

    函数,我之前也提到过一点点内容.其实函数是很好理解的,但是写起来又十分麻烦. 一.     函数引入 我们知道,C源程序是由函数组成的.请看下面的简单函数例子 #include <stdio.h ...

  10. c语言中函数的简单介绍

    c语言中函数的介绍: 函数,简单的说就是代码的打包.存放在一个地方,当需要的时候调用. 函数分类: 1.无参无返回值函数 void func() 2.无参有返回值函数  int func() 3.有参 ...

随机推荐

  1. Python开发的入门教程(七)-切片

    介绍 本文主要介绍Python中切片的基本知识和使用 对list进行切片 取一个list的部分元素是非常常见的操作.比如,一个list如下: >>> L = ['Adam', 'Li ...

  2. 石子合并(区间dp典型例题)

    Description 有n堆石子排成一行,每次选择相邻的两堆石子,将其合并为一堆,记录该次合并的得分为两堆石子个数之和.已知每堆石子的石子个数,求当所有石子合并为一堆时,最小的总得分. Input ...

  3. 深入了解Redis【一】源码下载与参考资料准备

    引言 一直在使用redis,但是却没有系统的了解过它的底层实现,准备边学习边记录,深入了解redis. 打算分析以下几个方面: redis的基本类型及底层原理与java对比,每种数据类型的使用场景 r ...

  4. ASP导出数据到excel遇到的一些问题

    一直用动易平台的ASP做新闻发布网站,直到现在才接触导出数据到Excel的问题,目的在于公司要统计各部门的投稿量,要做这么个东西,实现起来是挺简单的,但是第一次做,还是费了一些功夫的,特此记录一下 主 ...

  5. 跟着兄弟连系统学习Linux-【day08】

    day08-20200605 p27.软件包管理简 windows 和 linux 软件是不同的版本. Linux源码包,开源的.绝大部分都是C语言写的.源码包安装速度比较慢.需要先编译后再安装.脚本 ...

  6. shell中列表的定义与循环

    字符串列表定义方法1: a=(f1 f2 f3 f4) for i in ${a[*]}#遍历每一个列表值 for i in ${a[@]}#遍历每一个列表值 实例: #!bin/basha=(f1 ...

  7. MyBatis动态SQL(使用)整理

    MyBatis 令人喜欢的一大特性就是动态 SQL.在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的.MyBatis 动态 SQL 的出现, 解决了这个麻烦. MyBa ...

  8. SMBMS

    SMBMS(Supermarket Billing Management System ) 目录 SMBMS(Supermarket Billing Management System ) 1. 项目 ...

  9. Windows docker镜像文件无法删除

    最近刚开始玩docker,下载镜像之前没有修改docker的保存路径,因此默认存在了c:\programdata下面,导致C盘空间不足. 之后修改了保存路径之后( docker engin里加&quo ...

  10. python爬虫学习过程记录

    项目为爬取Python词条的信息. 项目代码在我的码云仓库. https://gitee.com/libo-sober/learn-python/tree/master/baike_spider 1. ...