在从控制台读取字符的时候,常用的函数有scanf()、 gets()、fgets()这几个函数,那么这几个函数有什么区别和联系呢?

1、scanf()函数

  sacnf() 函数用来从键盘读取字符串,下面通过一个简单的例子来看一下它的用法。

#define LEN 20
int main()
{char str[LEN];printf("enter a string:\r\n");scanf("%s",str);printf("string is:\r\n");printf("%s",str);system("pause");return 0;
}

  提示输入一个字符串,然后将输入的字符串打印出来。测试结果如下:

  输入的字符串是“abc def”,但是打印出来的字符串是"abc"。由此可见scanf()函数更像一个单词读取函数,当遇到空白字符时,就会自动结束。
这就要求输入的字符串中间不能有空格。

  一般scanf()函数和printf()函数一起使用。

2、gets()函数

  gets() 函数也是用来从键盘读取字符串,下面通过一个简单的例子来看一下它的用法。

#define LEN 20
int main()
{char str[LEN];puts("enter a string:");gets(str);puts("string is:");puts(str);system("pause");return 0;
}

测试结果如下:

  输出的字符串和输入的字符串一样,说明gets函数读取字符串的时候中间可以有空格。在输入字符串的时候,按回车键之后,才会打印出输入的字符,说明gets()函数是通过换行符来结束字符串的读取的。

  通过观察代码和输出的字符串可以发现,在代码中没有输出换行符,但是打印的字符串自动换行了,说明使用puts()函数输出的时候,自动在字符串的末尾加上的换行符。

  一般gets()函数和puts()函数一起使用。

3、fgets()函数

  fgets() 函数也是用来从键盘读取字符串,但是它在读取字符串的时候,还需要设置参数。下面通过一个简单的例子来看一下它的用法。

#define LEN 20
int main()
{char str[LEN];fputs("enter a string:",stdout);fgets(str,LEN,stdin);fputs("string is:",stdout);fputs(str,stdout);system("pause");return 0;
}

输出结果如下:

  输出的字符串和输入的字符串一样,说明fgets函数读取字符串的时候中间可以有空格。在输入字符串的时候,按回车键之后,才会打印出输入的字符,说明fgets()函数是通过换行符来结束字符串的读取的。
  在代码中没有加入回车换行符,打印出的字符串也没有换行,说明fputs()函数不会自动在字符串后面加入回车换行符。

  在读取字符串的时候,fgets()函数里面有三个参数,第一个是要存储的字符串位置,第二是要读取字符串的最大长度。第三个是从哪个设备输入。 stdin 表示标准的输入设备,也就是键盘。stdout表示标准的输出设备,也就是显示器。

  通过第三个参数可以看出,fgets函数不仅可以从键盘读取数据,也可以从其他地方读取数据,那么将代码改为从文件中读取数据试试。

#define LEN 20
int main()
{char str[LEN];FILE *in;in = fopen("abc.txt","r");fputs("read a string:\r\n",stdout);fgets(str,LEN,in);fputs("string is:\r\n",stdout);fputs(str,stdout);system("pause");return 0;
}

  首先打开一个文本文档,然后使用fgets()函数从打开的文档中读取数据,最后将数据打印出来。

  对比输出结果和文本中内容可以看出,从文件中读取字符串也是成功的。 同样也可以从键盘中读取数据,然后写入到文本中去。修改代码如下:

 in = fopen("abc.txt","a+");fputs("read a string:\r\n",stdout);fgets(str,LEN,stdin);fputs("string is:\r\n",stdout);fputs(str,in);

  这里通过追加的方式打开记事本,然后读取键盘上的内容,通过fputs函数,写入到记事本中去。

  对比输入的字符串和记事本中的内容,可以看出在控制台输入的字符串已经被成功追加到了记事本中。由此可见fgets()和fputs()是一个通用的输入输出函数。不仅仅在控制台可以使用,在其他输入输出设备上也可以使用。

总结

  通过上面的例子可以总结出这三个字符输入函数的特点:

  • scanf()函数比较适合于用来读取单词,遇到空白字符时就自动结束。
  • gets()函数比较适合读取字符串,它是遇到回车换行符才会结束。
  • fgets()函数是一个通用的输入函数,它可以从控制台以外的设备上读取字符串,功能更加强大,但是在使用的时候传入的参数比较多。

C语言学习笔记---字符读取函数scanf()、gets()、fgets()相关推荐

  1. c语言中void arrout,c语言学习笔记(数组、函数

    <c语言学习笔记(数组.函数>由会员分享,可在线阅读,更多相关<c语言学习笔记(数组.函数(53页珍藏版)>请在人人文库网上搜索. 1.数组2010-3-29 22:40一维数 ...

  2. 基础 - 字符读取函数scanf、getchar、gets、cin(清空缓存区解决单字符回车问题)

    基础 - 字符读取函数scanf.getchar.gets.cin(清空缓存区解决单字符回车问题) 参考文章: (1)基础 - 字符读取函数scanf.getchar.gets.cin(清空缓存区解决 ...

  3. c语言学习笔记之分段函数

    内容来自哔哩哔哩视频 [浙江大学]C语言入门与进阶 翁恺 学习笔记 分段函数 if ( x < 0 ) { f = -1; } else if ( x == 0 ) { f = 0; } els ...

  4. C语言学习笔记---字符串转换函数

    字符串转整数   字符串转换为整数的函数有两个,他们的函数原型如下: int __cdecl atoi(const char *_Str);long __cdecl atol(const char * ...

  5. C语言学习笔记---字符串查找函数strstr()和strpbrk()函数

    strstr()函数   C语言中如何向查找一个字符串中是否包含另一个字符串,可以使用strstr()函数.使用示例如下: int main(int argc, char *argv[]) {char ...

  6. Go 语言学习笔记(二):函数

    目录 函数 函数定义 函数签名和匿名函数 defer 闭包 概念 panic 和 recover 函数 函数是程序执行的一个基本语法结构,Go 语言的很多特性是基于函数这个基础实现的,比如命名类型的方 ...

  7. C语言学习笔记---数据拷贝函数memcpy()和memmove()函数

      在C语言中拷贝字符串的时候通常可以使用strcpy()函数和strncpy()函数,这两个函数是专门针对字符串拷贝的.如果想要拷贝其他类型数组的话,可以使用memcpy()和memmove()函数 ...

  8. C语言学习笔记---字符串对比函数strspn()和strcspn()函数

    strspn()函数   如果要对比两个字符串中从第一个字符开始总共有多少个相同字符时,可以使用strspn()函数,它里面有两个参数字符串1和字符串2,从字符串1开始位置依次对比字符串1和字符串2有 ...

  9. C语言学习笔记---字符串拼接函数 strcat() 和 strncat()

    strcat()函数    strcat()函数主要用来拼接字符串,用于将一个字符串拼接到另一个字符串的后面.下面通过一个简单的例子来演示一下这个函数的使用方法. int main() {char s ...

最新文章

  1. css3 渐变、蒙版
  2. sql server datetime转char的方法
  3. 让创新触手可及,阿里云容器服务 ACK 发行版开放免费下载
  4. 登录及注册模块设置与流程图
  5. C#InI文件读写剖析
  6. 在WIN7下硬盘安装XP双系统
  7. codejam题目_嵌套深度-Google CodeJam 2020资格回合问题解决方案
  8. redshift 数据仓库_您如何使用Amazon Redshift Spectrum访问“暗数据”
  9. ffmpeg 无法找到libpostproc的问题
  10. Android Canvas drawText实现中文垂直居中
  11. anaconda查看删除增加镜像源
  12. Hadoop管理员的十个最佳实践(转)
  13. JUC学习之CountDownLatch入门
  14. resin java_让resin4自动编译java文件
  15. Ubuntu 下apache2 虚拟主机配置
  16. VB生成二维码图形的控件,CSDN利用盗版卖卖会员44积分赚钱
  17. 淘宝粉丝增加技巧!京东店铺粉丝可以买?
  18. 笛卡尔坐标系中八个卦限对应的位置
  19. 名编辑电子杂志大师教程 | 主页按钮
  20. Java设计模式及应用场景之《单例模式》

热门文章

  1. 那些年踩过的坑之:first-child伪类选择器
  2. Spring Ioc Configration - Annotation
  3. C语言 strftime 格式化显示日期时间 时间戳
  4. KMP算法详解P3375 【模板】KMP字符串匹配题解
  5. IIS7部署网站的一些细节问题。
  6. SqlServer数据冗余的问题和解决
  7. Tao 1.2.0图形框架发布
  8. 解决IE6下CSS兼容性的两把神器
  9. 专注于分布式存储计算技术及其应用url http://www.nosqlnotes.net/
  10. 一些常用算法 练手的的代码