C语言输入字符串各个函数及其区别

C语言有多个函数可以从键盘获得用户输入,它们分别是:
• scanf():和 printf() 类似,scanf() 可以输入多种类型的数据。
• getchar()、getche()、getch():这三个函数都用于输入单个字符。
• gets():获取一行数据,并作为字符串处理。
scanf() 是最灵活、最复杂、最常用的输入函数。

输入单个字符

输入单个字符当然可以使用 scanf() 这个通用的输入函数,对应的格式控制符为%c,上节已经讲到了。本节我们重点讲解的是 getchar()、getche() 和 getch() 这三个专用的字符输入函数,它们具有某些 scanf() 没有的特性,是 scanf() 不能代替的。

1. getchar()

最容易理解的字符输入函数是 getchar(),它就是scanf("%c", c)的替代品,除了更加简洁,没有其它优势了;或者说,getchar() 就是 scanf() 的一个简化版本。
但你如果想输入字符串则用for循环输入
char a[10],s;
for(int i=0;i<6;i++)
a[i]=getche();
但注意的是后面要紧跟一个getchar();
用来吸收空格,否则当你使用下个getchar()会自动吸收上个回车键,会出现意想不到事情;
char a[10],s;
for(int i=0;i<6;i++)
a[i]=getche();
s=getchar();
for(int i=0;i<6;i++)
printf("%c",a[i]);
printf("\ndf%cgh",s);
输入:asdfgh
输出:asdfgh
df
gh
注意:我们只是给a[i]赋值,并没有给s赋值,但把输入:asdfgh后的回车直接给了s;
下面的代码演示了 getchar() 的用法:

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

输入示例:
@(回车)
c: @
你也可以将第 4、5 行的语句合并为一个,从而写作:
char c = getchar();

2. getche()

getche() 就比较有意思了,它没有缓冲区,输入一个字符后会立即读取,不用等待用户按下回车键,这是它和 scanf()、getchar() 的最大区别。请看下面的代码:

#include <stdio.h>
#include <conio.h>
int main()
{
char c = getche();
printf("c: %c\n", c);
return 0;
}

输入示例:
@c: @
输入@后,getche() 立即读取完毕,接着继续执行 printf() 将字符输出,所以没有按下回车键程序就运行结束了。

注意,getche() 位于 conio.h 头文件中,而这个头文件是 Windows 特有的,Linux 和 Mac OS 下没有包含该头文件。换句话说,getche() 并不是标准函数,默认只能在 Windows 下使用,不能在 Linux 和 Mac OS 下使用。

3) getch()

getch() 也没有缓冲区,输入一个字符后会立即读取,不用按下回车键,这一点和 getche() 相同。getch() 的特别之处是它没有回显,看不到输入的字符。所谓回显,就是在控制台上显示出用户输入的字符;没有回显,就不会显示用户输入的字符,就好像根本没有输入一样。

回显在大部分情况下是有必要的,它能够与用户及时交互,让用户清楚地看到自己输入的内容。但在某些特殊情况下,我们却不希望有回显,例如输入密码,有回显是非常危险的,容易被偷窥。所以可以在输入密码时使用。(本文最后会贴出隐形密码输入回显*的代码供大家参考)
getch() 使用举例:

 #include <stdio.h>
 #include <conio.h>
 int main()
 {
 char c = getch();
 printf("c: %c\n", c);
 return 0;
 }

输入@后,getch() 会立即读取完毕,接着继续执行 printf() 将字符输出。但是由于 getch() 没有回显,看不到输入的@字符,所以控制台上最终显示的内容为c: @。

注意,和 getche() 一样,getch() 也位于 conio.h 头文件中,也不是标准函数,默认只能在 Windows 下使用,不能在 Linux 和 Mac OS 下使用。
对三个函数的总结

函数缓冲区头文件回显适用平台
getchar()stdio.hWindows、Linux、Mac OS 等所有平台
getche()conio.hWindows
getch()conio.hWindows

输入字符串

输入字符串当然可以使用 scanf() 这个通用的输入函数,对应的格式控制符为%s,
这个大多数都会用,唯一注意的一点:严格按照格式输入
scanf("输入你的姓名:%s",s);
在输入时要这样输入:输入你的姓名:张三
要带上“输入你的姓名:”

1,gets()

这个专用的字符串输入函数,它拥有一个 scanf() 不具备的特性。
gets() 的使用也很简单,请看下面的代码:

1. #include <stdio.h>
2. int main()
3. {
4. char author[30], lang[30], url[30];
5. gets(author);
6. printf("author: %s\n", author);
7. gets(lang);
8. printf("lang: %s\n", lang);
9. gets(url);
10. printf("url: %s\n", url);
11. return 0;
12. }

运行结果:
YanChangSheng↙
author: YanChangSheng
C-Language↙
lang: C-Language
gets() 是有缓冲区的,每次按下回车键,就代表当前输入结束了,gets() 开始从缓冲区中读取内容,这一点和 scanf() 是一样的。gets() 和 scanf() 的主要区别是:
• scanf() 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串。
• gets() 认为空格也是字符串的一部分,只有遇到回车键时才认为字符串输入结束,所以,不管输入了多少个空格,只要不按下回车键,对 gets() 来说就是一个完整的字符串。
也就是说,gets() 能读取含有空格的字符串,而 scanf() 不能。
但getchar与gets一样能吸收上次输入完毕所按下的回车键,所以在使用gets(),getchar(),输入字符串或字符之前加上getchar();用来吸收上次的空格,当然如果之前没有回车键就不用加了。
输出字符串时用%s,加数组首地址。当用%c时用for循环才能输出。

2,可以使用循环通过getchar()等读入字符串

优势:可以自定义字符串的结束标志符。

ch=getchar();
char a[6];
string str;
int i=0;
while(ch!='?'||i=6)//以“?”字符结束输入,并限制输入个数
{
    a[i]=ch;
    str+=ch:
  ch=getchar();
    i++;
	}

总结

C语言中常用的从控制台读取数据的函数有五个,它们分别是
1.scanf()、getchar()、getche()、getch() 和 gets()。其中 scanf()、getchar()、gets() 是标准函数,适用于所有平台;getche() 和 getch() 不是标准函数,只能用于 Windows。
2.scanf() 是通用的输入函数,它可以读取多种类型的数据。
3.getchar()、getche() 和 getch() 是专用的字符输入函数,它们在缓冲区和回显方面与 scanf() 有着不同的特性,是 scanf() 不能替代的。若想输入字符串就用循环来输入。
4.gets() 是专用的字符串输入函数,与 scanf() 相比,gets() 的主要优势是可以读取含有空格的字符串。
5.gets与getchar();可以吸收上次的回车键,当你想输入信息时发现此信息跳了过去,就在输入函数前加上getchar();
6.scanf() 可以一次性读取多份类型相同或者不同的数据,getchar()、getche()、getch() 和 gets() 每次只能读取一份特定类型的数据,不能一次性读取多份数据。

密码隐形输入

#include<iostream>
#include <string.h>
#include <conio.h>
using namespace std;
int main()
{
	//string型密码输入 
//	string pass;
//	string n;
//	int j=0;
//	cout<<"输入:";
//	while((n=getch())!="\r")
//	{
//		if(n=="\b"&&j>0)
//		{
//			cout<<"\b \b";
//			pass+="\b ";
//			j--;
//		}
//		else if(n!="\b")//先输入123,删处一个,在输入4,再变量中保存为:123\b \b4
//						//用户看到的是124, 
//		{
//			cout<<"*";
//			j++;
//		}
//			pass+=n;
//		
//	}
//	char *name=(char*)pass.data();
//	if(pass.length()>0)
//	{
//			cout<<"pass:"<<pass<<endl;
//			cout<<"name"<<name<<endl;
//			cout<<strlen(name);
//	}
//char型输入 
	int i=0;
	char str1,c,password[100];
	cout<<"shuru:"; 
	while((str1=getch())!='\r')
	 {
		if(str1=='\b'&&i>0) 
		{

			printf("\b \b");
			--i;
		} 
		else if(str1!='\b') 
		{
			password[i++]=str1;
			printf("*");
		}
	}
	password[i]='\0';
	int n=strlen(password);
	cout<<" Passw:"<<password<<",n:"<<n;
}
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚无-缥缈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值