数据输入

本文详细介绍了C语言中从键盘获取用户输入的各种函数,包括scanf()、getchar()、getche()、getch()以及gets_s()。还讨论了代码安全性检查,如使用scanf_s()来避免SDL检查问题,并提供了scanf()的高级用法,如指定读取长度和匹配特定字符。
摘要由CSDN通过智能技术生成

1、函数

      在 C 语言中,有多个函数可以从键盘获取用户输入:

      ● scanf():和 printf() 一样,scanf() 可以从键盘获取多种类型的数据,可一次读取多份输入数据;

         该函数读取字符串以空格为结束符,也就是无法读取含有空格的字符串;

      ● getchar(),getche(),getch() :这三个函数都用于输入单个字符,一次只能读取一份输入数据;

      ● gets_s() :获取一行数据,并作为字符串处理;

2、关于代码安全性检查

      如何解决因 SDL 检查带来的代码无法运行的问题:

      ● 采用 scanf_s () 的安全版本;

      ● VS 新建项目去掉 " 安全开发生命周期(SDL)检查 " 即可;

      ● 在头文件包含最前面加 #define _CRT_SECURE_NO_WARNINGS 宏定义;

      ● 在编译头文件最前面加 #pragma warning( disable : 4996);

3、代码

       scanf () 函数是格式化从键盘获取输入,和 printf () 功能相反:

#include <iostream>
#include <string>
#include <stdio.h>

using namespace std;

int main()
{
	int a = 0, b = 0, c = 0, d = 0;
    //读取键盘输入并将值赋值给变量
    //& 称为取地址符
	scanf_s("%d", &a);
	scanf_s("%d", &b);
	printf("a+b=%d\n", a + b);
    //输出变量 a 的内存地址
    cout << &a << endl;
    printf("%#x", &a);
    //%p表示以十六进制形式输出数据的内存地址
    printf("%p\n", &a);
    //下一行代码获取的值可以输入一个回车再输入另一个
    //也可以输入一个,按照格式要求空格,在同一行再输入另一个
	scanf("%d %d", &c, &d);
	printf("a*b=%d\n", c*d);
	return 0;
}

4、读取步骤

      ● 我们键盘输入的数据并没有直接交给 scanf() ,而是放入了缓冲区,知道回车之后 scanf() 才到缓冲区读取;

5、scanf () 格式控制符

格式控制符说明
%c读取一个单一的字符
%hd , %d , %ld读取一个十进制整数,并分别赋值给short、int、long
%ho , %o , %lo读取一个八进制整数 (前缀随意) ,并分别赋值给short、int、long
%hx , %x , %lx读取一个十六进制整数 (前缀随意),并分别赋值给short、int、long 
%hu , %u , %lu读取一个无符号整数,并分别赋值给 unsigned short、int、long

%f , %lf

读取一个十进制小数,并分别赋值给float、double
%e , %le

读取一个指数形式的小数,并分别赋值给float、double

%g , %lg既可以读取一个十进制形式的小数,又可以读取一个指数形式的小数分别赋值给float、double
%s读取一个字符串,以空格为结束符

 

 

 

 

 

 

 

 

 

 

6、getchar ()、getche ()、getch ()

      ● getchar () 就是 scanf ("%c" , c) 的替代:

#include <iostream>
#include <string>
#include <stdio.h>

using namespace std;

int main()
{
	char a = getchar();
	printf("%c", a);
    return 0;
}

      ● getche () 函数没有缓冲区,输入一个字符后立刻读取,不需要用户按下回车键:

#include <iostream>
#include <string>
#include <stdio.h>
#include <conio.h>

using namespace std;

int main()
{
	char a = getche();
	printf("\nc:%c\n", a);
    return 0;
}

      ● getch () 也没有缓冲区,特别之处是没有回显,看不到输入的字符:

#include <iostream>
#include <string>
#include <stdio.h>
#include <conio.h>

using namespace std;

int main()
{
	char a = getch();
	printf("\nc:%c\n", a);
    return 0;
}

      ● getche () 和 getch () 函数都位于 conin.h 中,不是标准函数,默认只能在 Windows 下使用;

7、getchar ()、getche ()、getch () 总结

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

 

 

 

 

 

8、gets_s () 

      ● gets_s () 函数用来获取键盘输入的字符串:

#include <iostream>
#include <string>
#include <stdio.h>
#include <conio.h>

using namespace std;

int main()
{
	char a[20];
	gets_s(a);
	printf("a=%s\n", a);
    return 0;
}

      ● gets_s () 可以读取带有空格的字符串,scanf () 不能;

9、scanf () 的高级用法

9.1、指定读取长度

      ● %10s 表示读取字符串的最大长度为10;

#include <iostream>
#include <stdio.h>
#include <conio.h>

using namespace std;

int main()
{
	char a[20];
	int b;
	scanf("%10s", &a);
    //清空scanf缓冲区
	rewind(stdin);
	printf("%s\n", a);
	scanf("%5d", &b);
	rewind(stdin);
	printf("%d\n", b);
}

9.2、匹配特定的字符

      ● %[a-z]:只读取小写字母;

      ● %[^a-z]:读取除小写字母之外的所有;

      ● %[0-9]:只读取数字0-9;

      ● %[A-Z]:只读取大写字母;

      ● %[a-zA-Z]:读取所有英文字母;

      ● %[a-zA-Z0-9]:读取所有;

#include <iostream>
#include <string.h>

int main()
{
	char a[30];
	//读取除换行符之外的所有字符
	scanf("%[^\n]", a);
	rewind(stdin);
	printf("%s\n", a);
}
#include <iostream>
#include <stdio.h>
#include <conio.h>

using namespace std;

int main()
{
	char a[20];
	scanf("%[a-zA-Z]", &a);
	rewind(stdin);
	printf("%s\n", a);

}
#include <iostream>
#include <stdio.h>
#include <conio.h>

using namespace std;

int main()
{
	char a[30];
	//读取长度最大为20的除数字和换行符之外的字符串,可以读取空格
	scanf("%20[^0-9\n]", &a);
	rewind(stdin);
	printf("%s\n", a);
}

9.3、丢弃读取到的字符

      ● %*d:表示读取一个整数并丢弃;

      ● %*[a-z]:表示将读取的小写字母丢弃;

      ● %*[^a-z]:表示将小写字母之外的所有丢弃;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值