char s[20]; gets(s); puts(s);

gets与scanf输入字符串的方式也非常类似,但是有几个区别:

(1) gets的输入分割符只有回车,因此gets是能够读入空格的。如果输入为"hello world"时,上面程序的运行结果是"hello world"。而如果用scanf则只能输出hello

(2) 此外,scanf和gets对待缓冲区里的回车符也是完全不同的。scanf在读取非空白符之前会忽略回车,读取之后如果遇到空白字符会停止输入,将其留着缓冲区里;gets只要一遇到回车就输入结束,并把这个回车从缓冲区里移走。

(3) gets可以读取空回车,但是scanf不能。

例如输入为"\nhello\n",也就是说,先输入一个空行,然后在第二行输入"hello"并回车。scanf按照它的读取原理,把第一个’\n’作为空白符忽略掉,然后读取字符串"hello",遇到第二个’\n’时输入结束,但是第二个’\n’会被scanf残留在缓冲区里。scanf的输入结果是读入字符串"hello"。当用gets进行读取时,它遇到第一个’\n’,就找到了它的输入分隔符,停止继续输入,第一个’\n’被从缓冲区中读走了,缓冲区里剩下"

gets从标准输入设备读字符串函数。可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。

#include <stdio.h>int main(){char ch[100] ;gets(ch);for (int i = 0; i < 100; i++){printf("%d  ",ch[i]);}return 0;
}

char ch[100] ;scanf("%s",ch);for (int i = 0; i < 100; i++){printf("%c  ",ch[i]);}

scanf("%s",ch);只把11读了进来,并且把空白字符都残留在了缓冲区。

scanf(" %s",ch);可以吧之前残留的空白子字符读走。

getchar可以读走一个残留的空白字符,scanf(" ");可以都走之前最后一个非空白字符后的全部空白字符。

转载自:https://blog.csdn.net/wordwarwordwar/article/details/52579503

功能

编辑

从stdio流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为‘\0’空字符,并由此来结束字符串。

返回值

编辑

读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发生错误,返回NULL指针。所以在遇到返回值为NULL的情况,要用ferror或feof函数检查是发生错误还是遇到EOF。

注意

编辑

本函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。这个事实导致gets函数只适用于玩具程序,为了避免这种情况,我们可以用fgets(stdin) (fgets实际上可以读取标准输入(即大多数情况下的键盘输入),具体参阅fgets词条)来替换gets()。在V7的手册(1979年)中说明:为了向后兼容,gets删除换行符,gets并不将换行符存入缓冲区。

由于可以无限读取,所以在2011年12月,ANSI 采纳了 ISO/IEC 9899:2011 标准,标准中删除了 gets()函数,使用一个新的更安全的函数gets_s()替代(具体用法看下面示例)。

示例

编辑

C:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

#include <stdio.h>    //这个头文件包含gets()函数,这个函数在ISO/IEC 9899 2011(C11)标准中被移除

int main(void)

{

    char str1[5];  //不要char*p,然后gets(p),这是错误的,因为p没有指向有效的内存,它可能指向任何非法地址                   //     地方的未知大小的内存块,这样以来,就可能修改了不属于本程序的内存的内容

    gets(str1);

    printf("%s\n", str1);

    return 0;

}

#include <stdio.h>//gets_s()用法

#define CH 20

int main(void)

{

    char ch[CH];

    printf("请输入你的名字:\n");

    gets_s(ch,CH);             //这里不能用gets_s(ch);

    printf("这是你的名字:%s\n", ch);

    return 0;

}

C++:

1

2

3

4

5

6

7

8

9

10

#include <iostream>

#include <cstdio>

using namespace std;

int main()

{

    char str[100];

    gets(str);

    cout<<str<<endl;

    return 0;

}

gets()函数用来从标准输入设备(键盘)读取字符串直到换行符结束,但换行符会被丢弃,然后在末尾添加'\0'字符。其调用格式为:

gets(s);

其中s为字符串变量(字符串数组名或字符串指针)。

gets(s)函数与scanf("%s",s)相似,但不完全相同,使用scanf("%s",s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。

也就是说:gets()函数读取到\n(我们输入的回车)于是停止读取,但是它不会把\n包含到字符串里面去。然而,和它配合使用的puts函数,却在输出字符串的时候自动换行。

说明

编辑

gets(s) 函数中的变量s为一字符串指针。如果为单个字符指针,编译连接不会有错误,但运行后内存溢出错误。

宽字符版本,当使用unicode宽字符文本时,使用这个函数 _getws();

在C11标准中被删除,可用C标准库中的fgets代替.

大数据 开发月薪35K+!可是,多数程序员会学吗?

大数据技术与运用的成熟,应用集中于互联网、金融、医疗、新能源、通信和房地产等行业。整理平均薪资情况和大数据学习大纲供查看

hello\n"。gets的输入结果是一个空串,即一个首字符是’\0’的字符串。

Gets和scanf的区别相关推荐

  1. fgets和scanf的区别

    fgets和scanf的区别 1.测试使用scanf的一个例子: [cpp] view plaincopyprint? #include "stdio.h" #include &q ...

  2. 浅谈getch(),getche(),getchar(),gets(),scanf()的区别

    getch(),getche(),getchar(),gets(),scanf()的区别,综合很多博客的文章. getch()和getchar() getchar()是C的标准库函数,包含在头文件&l ...

  3. 由一道简单题引出的cin和scanf的区别

    题目是乒乓球 [题目背景] 国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及.其中 11 分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役.华 ...

  4. 探讨getchar与scanf的区别

    前言 说到scanf与getchar,想必大家都不陌生,在学习C语言的第一天起我们就开始接触它们,但我们对它们在输入方面可能有点模棱两可,分不清scanf与getchar真正有什么区别,下面就来分别探 ...

  5. c语言中gets和scanf的区别,gets 和 scanf 区别

    在C语言中,scanf和gets这两个函数进行输入.gets的输入分割符只有回车,gets是能够读入空格的,但是scanf不能. 在 C 语言中,主要用 scanf 和 gets 这两个函数(在 st ...

  6. getchar与scanf的区别

    getchar getchar先读取一个字符放到ch里面去,如果这个字符不等于EOF,就进入循环,打印这个字符.当getchar读到文件末尾或者结束时,它会返回一个EOF,此时结束循环. 输入A,输出 ...

  7. c语言中的printf函数和scanf的区别

    --printf函数在c语言中的普通用法 在c语言中printf函数的作用非常大,用途也非常广泛,它主要具有打印功能. 在调用printf函数是必须给其提供格式串,格式串后面的参数是需要在显示时插入到 ...

  8. c语言scanf和printf区别,printf和scanf的区别是什么

    printf和scanf的区别:1.printf是格式化的输出函数,scanf是C语言的输入功能:2.printf用于以规定格式将信息输出到标准输出设备,scanf是一种格式输入功能,即以用户指定的格 ...

  9. c语言scanf和gets,gets和scanf有什么区别

    gets和scanf都是可以在C语言中用于读取字符串的,但是它们实际上也有很大的不同,本篇文章我们就来看一下gets和scanf之间有什么区别. gets和scanf的区别 1. gets可以接收空格 ...

最新文章

  1. 项目管理过程中应注意的问题
  2. Codeforces 894.D Ralph And His Tour in Binary Country
  3. angular核心原理解析3:指令的执行过程
  4. 《Unit Testing》2.1 伦敦学派如何做隔离
  5. 微信小程序实战篇:商品属性联动选择(案例)
  6. asp.net EF+MVC2实战2
  7. QT-lesson1-无边框窗口创建/拖拽/阴影-20190322
  8. 关于MFC自动生成的各个类的指针访问
  9. jQuery源码分析系列:.domManip() .buildFragment() .clean()
  10. 牛客网 斐波那契数列
  11. 在Scala中评估val,var,lazy val和def构造时
  12. flink EventTime与Window
  13. 山东理工大学ACM平台题答案关于C语言 1231 绝对值排序
  14. python公众号接口_用Python实现微信公众号API素材库图文消息抓取
  15. AI在零售业的五大应用场景:消费者喜欢苹果时,不要给他一箱梨
  16. uni-app小程序利用动画做出左右滑动切换的效果
  17. 计算机英语词汇音频,[听单词] 计算机专业英语词汇音频84,计算机英语单词MP3
  18. CTF|pwn栈溢出入门题level3解题思路及个人总结
  19. 2018-08-11 自学笔记
  20. C#设计模式(4)-Simple Factory Pattern

热门文章

  1. Scrapy电影天堂最新电影信息爬取
  2. 记:《洛克菲勒留给儿子的38封信》-- 37
  3. 【产品】《用户体验要素》结构层(交互设计和信息架构)
  4. 暴利项目赚钱月入5万,进来看看吧!
  5. 量子力学、波函数与量子计算:揭开宇宙微观奥秘的神奇之门
  6. C语言基础:翁恺笔记
  7. Python+pyGame 打砖块游戏
  8. Android SDK-----Android9.0
  9. mysql 函数 人民币大写_SQL Server中文大写金额转化函数
  10. 聚焦行业,赋能客户 | 博云容器云产品族五大行业解决方案发布