C语言scanf与get char,gets的区别


1.scanf()

scanf是C语言的格式输入函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。

在这里我想 列下一个‘格式化说明符’的表来自于下面这个链接

https://blog.csdn.net/21aspnet/article/details/174326)

(A)                格式化说明符

格式字符           说明

%a                 读入一个浮点值(仅C99有效)

%A                 同上

%c                 读入一个字符

%d                 读入十进制整数

%i                 读入十进制,八进制,十六进制整数

%o                 读入八进制整数

%x                 读入十六进制整数

%X                 同上

%c                 读入一个字符

%s                 读入一个字符串

%f                 读入一个浮点数

%F                 同上

%e                 同上

%E                 同上

%g                 同上

%G                 同上

%p                 读入一个指针

%u                 读入一个无符号十进制整数

%n                 至此已读入值的等价字符数

%[]                扫描字符集合

%%                 读%符号

但是由于我初学C语言所以很多格式字符并没有见过,这算是课外学习度娘上的知识啦,上面那个链接详细讲述了scanf的一些问题,可以去看一下哦。

我要讲一个关于scanf从键盘输入数据时,给多个变量赋的值之间一定要用空格、回车或者 Tab 键隔开,用以区分是给不同变量赋的值。而且空格、回车或 Tab 键的数量不限,只要有就行。一般都使用一个空格。(需要注意的是当你要给多个变量赋值的时候不要加上“逗号”,不然你在编译的时候就需要把你输进去的逗号再输一遍了)

scanf()以Space(空格),Enter(回车),tab结束一次输入,最后输入的回车符不会被舍弃(留在缓冲区中)。

#include <stdio.h>
int main()
{
char op1, op2;
scanf("%c", &op1);
scanf("%c", &op2);
printf("%d %d\n", op1, op2);
return 0;
}

运行结果

q

113 10

Process exited after 5.982 seconds with return value 0

请按任意键继续. . .

看吧,此时你会发现输出的第二个数是10,因为scanf会将缓冲区中的回车符读取,当输入缓冲区已经没有东西的时候就会输出结果。

2.get char()

getchar()是在输入缓冲区【顺序】读入【一个】字符(包括Space、Enter和Tab还有字母,数字别忘了也算符号)依旧以Enter键结束,只不过Enter键也会被放入缓冲区。

这里需要说一下如果你一次输入了多个字符的话,那接下来它所取得字符会直接从缓冲区中取出。

#include <stdio.h>
int main() {
char op1,op2,op3;
op1=getchar();
op2=getchar();
op3=getchar();
printf("%d %d %d\n",op1,op2,op3); return 0;
}

以下是多种编译运行结果

abc

97 98 99

Process exited after 6.842 seconds with return value 0

请按任意键继续. . .


a b//注意中间有个空格

97 32 98

Process exited after 8.391 seconds with return value 0

请按任意键继续. . .


a

b

97 10 98//这里是输入了字母a然后一个回车然后字母b(最后会输入一个回车被留在了缓冲区中,只读取了前三个字符)

Process exited after 13.01 seconds with return value 0

请按任意键继续. . .

3.gets()

gets是从标准输入设备(键盘)读‘字符串’函数,它可以无限读取,不会判断上限,以回车结束读取。可以说gets() 函数不仅比 scanf 简洁,而且,就算输入的字符串中有空格也可以直接输入,不用像 scanf 那样要定义多个字符数组。

此外,关于使用 gets() 函数需要注意:使用 gets() 时,系统会将最后“敲”的换行符从缓冲区中取出来,然后丢弃,所以缓冲区中不会遗留换行符。这就意味着,如果前面使用过 gets(),而后面又要从键盘给字符变量赋值的话就不需要吸收回车清空缓冲区了,因为缓冲区的回车已经被 gets() 取出来扔掉了。

# include <stdio.h>
int main(void)
{
char wei[10];
char op;
printf("请输入字符串:");
gets(wei);
printf("%s\n", wei);
op = getchar();
printf("op = %c\n", op);
return 0;
}

请输入字符串:I love you

I love you

w

op = w (上一个输完I love you之后会输入一个回车键,并没有留在缓冲区,因此最后运行结果会正常输出字母w)

Process exited after 24.39 seconds with return value 0

请按任意键继续. . .

在这里可以讲述一下scanf与gets的一点区别

1.scanf :当遇到回车,空格和tab键会自动在字符串后面添加’\0’,但是回车,空格和tab键仍会留在输入的缓冲区中。

gets:可接受回车键之前输入的所有字符,并用’\n’替代 ‘\0’.回车键不会留在输入缓冲区中。

2.scanf不能接受空格、制表符Tab、回车等;

gets能够接受空格、制表符Tab和回车等;

它们字符串接受结束后自动加\0;

C语言scanf与get char,gets的区别的更多相关文章

  1. C语言 scanf()和gets()函数的区别

    C语言 scanf()和gets()函数的区别 1.相同点:scanf( )函数和gets( )函数都可用于输入字符串 2.不同点:两者在功能上有所区别,具体区别如下: 要实现如下需求“从控制台输入字 ...

  2. char *s 和char s[]的区别

    char *s 和 char s[] 的区别小结 博客分类: C语言 c教育 . 最近的项目中有不少c的程序,在与项目新成员的交流中发现,普遍对于char *s1 和 char s2[] 认识有误区( ...

  3. C/C++ char* arr与char arr[]的区别(反汇编解析)

    写作日期:2016.08.31 修改日期:2016.09.01 .2016.09.02. 交流qq:992591601 用了几天时间复习了下C语言.对于C语言的字符串操作有些不习惯,于是作为练习,写下 ...

  4. C语言中 *.c和*.h文件的区别!

    C语言中 *.c和*.h文件的区别!  http://blog.163.com/jiaoruijun07@126/blog/static/68943278201042064246409/        ...

  5. BIG5, GB(GB2312, GBK, ...), Unicode编码, UTF8, WideChar, MultiByte, Char说明与区别

    汉语unicode编译方式,BIG5是繁体规范,GB是简体规范 GB是大陆使用的国标码,BIG5码,又叫大五码,是台湾使用的繁体码. BIG5编码, GB编码(GB2312, GBK, ...), U ...

  6. OJ提交题目中的语言选项里G++与C++的区别

    一.OJ提交题目中的语言选项里G++与C++的区别 http://www.th7.cn/Program/cp/201405/199001.shtml 首先更正一个概念,C++是一门计算机编程语言,G+ ...

  7. C语言中左值和右值的区别(C语言学习笔记)

    重要的内容要重复强调: C语言的术语Ivalue指用于识别或定位一个存储位置的标识符.( 注意:左值同时还必须是可改变的) 其实rvalue的发明完全是为了搭配lvalue , rvalue你可以理解 ...

  8. 【C/C++】字符数组:char,char*,char a[], char *a[], char **s 的区别与联系/const char*和char*的区别

    一.char,char*,char a[], char *a[], char **s 的区别与联系 C语言中的字符串是字符数组,可以像处理普通数组一样处理字符串. 可以理解为在内存中连续存储的字符. ...

  9. char 和 varchar2 区别

    char 与 varchar2 区别 a:char长度固定而varchar2长度可变 b:char的遍历效率要比varchar2的效率稍高 c:char 浪费空间节省时间 varchar2浪费时间节省 ...

随机推荐

  1. spring AOP Capability and Goals(面向方面编程功能和目标归纳)

    原官方文档链接: https://docs.spring.io/spring/docs/5.1.6.RELEASE/spring-framework-reference/core.html#aop-i ...

  2. TCP客户端 服务端详细代码

    本文章转自http://www.myexception.cn/program/1912019.html TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TC ...

  3. Tomcat服务器配置https认证(使用keytool生成证书)

    一.证书生成 1.生成服务器证书 (1)打开打开命令控制台,进入jdk的bin目录 cd D:\Program Files\jdk1.6.0_45\bin (2)keytool为Tomcat生成证书( ...

  4. java.util.concurrent.Semaphore 使用

    1. 概述 Semaphore(信号)  并不存在真正的许可 只是维护一个计数器, 通常用来限定进入一些资源的线程数 accquire()  方法获取许可 成功则计数器值-1 没有则阻塞直到一个可用的 ...

  5. 复活hexo静态博客的方法

    我的个人博客http://webhmy.com/是通过hexo搭建的,它支持图片显示,支持md,无需主机空间,可以满足我的大部分需求.但是在2年的使用的过程中遇到一些问题,这里记录下来.便于下次快速复 ...

  6. webapp 的简单开发

    web app 的技术平台很多,如adobe phonegap.sencha touch.appcan(国产).dcloud(国产)平台.我选择了dcloud平台,原因:简单,容易上手. web ap ...

  7. SQL Server中建立自定义函数

    在SQL Server中用户可以自定义函数,像内置函数一样返回标量值,也可以将结果集用表格变量返回.用户自定义函数的2种类型:1.标量函数:返回一个标量值:2.表格值函数{内联表格值函数.多表格值函数 ...

  8. 关于安卓开发的学习一:webview

    在网上看到几篇不错的博客,分享和学习一下! Android使用WebView加载网页 https://blog.csdn.net/tuke_tuke/article/details/51684254 ...

  9. 关于比特币的“冷存储”和Armory的使用

    转自:http://8btc.com/thread-1164-1-1.html 最近随着比特币话题的火热,又有一批人卖房或倾产换成比特币入圈,这一次与以前不同的是,以前倾产入圈的人都是技术人员,有足够 ...

  10. [acm 1001] c++ 大数加法 乘法 幂

    北大的ACM 1001 poj.org/problem?id=1001 代码纯手动编写 - - #include <iostream> #include <cstdio> #i ...