c语⾔怎么从键盘输⼊坐标,C语⾔从键盘输⼊数据
程序是⼈机交互的媒介,有输出必然也有输⼊。在C语⾔中,有多个函数可以从键盘获得⽤户输⼊:
scanf():和 printf() 类似,scanf() 可以输⼊多种类型的数据。
getchar()、getche()、getch():这三个函数都⽤于输⼊单个字符。
gets():获取⼀⾏数据,并作为字符串处理。
scanf() 是最灵活、最复杂、最常⽤的输⼊函数,但它不能完全取代其他函数,⼤家都要有所了解。
scanf()函数
scanf 是 scan format 的缩写,意思是格式化扫描,也就是从键盘获得⽤户输⼊。我们先来看⼀个例⼦:
#include
#include
int main()
{
int a, b, c, d;
scanf("%d", &a); //输⼊整数并赋值给变量a
scanf("%d", &b); //输⼊整数并赋值给变量b
printf("a+b=%d\n", a+b); //计算a+b的值
scanf("%d %d", &c, &d); //输⼊两个整数并分别赋值给c、d
printf("c*d=%d\n", c*d); //计算c*d的值
system("pause");
return 0;
}
运⾏结果:
12↙
60↙
a+b=72
10 23↙
c*d=230
↙表⽰按下回车键。
从键盘输⼊12,按下回车键,scanf() 就会读取输⼊数据并赋值给变量 a,本次输⼊结束,执⾏下⼀条语句。接着给变量b赋值,也是同样的道理。
第9⾏代码中,我们同时输⼊两个整数并分别赋值给c、d。注意"%d %d"之间是有空格的,所以输⼊数据时也要有空格。也就是说,输⼊数据的格式要和控制字符串的格式⼀致。
scanf 和 printf ⾮常相似:
scanf("%d %d", &a, &b); // 获取⽤户输⼊的两个整数,分别赋值给变量 a 和 b
printf("%d %d", a, b); // 将变量 a 和 b 的是在显⽰器上输出。
它们都有格式控制字符串,都有变量列表。不同的是,scanf 的变量前要带⼀个&符号;&称为取地址符,也就是获取变量在内存中的地址。
在《⼆进制思想以及数据的存储》⼀节中讲到,数据是以⼆进制的形式保存在内存中的,字节(Byte)是最⼩的可操作单位。为了便于管理,我们给每个字节分配了⼀个编号,使⽤该字节时,只要知道编号就可以,就像每个学⽣都有学号,⽼师会随机抽取学号来让学⽣回答问题。字节的编号是有顺序的,从 0 开始,接下来是 1、2、3……
下图是 4G 内存中每个字节的编号(以⼗六进制表⽰):
这个编号,就叫做地址(Address)。int a;会在内存中分配四个字节的空间,我们将第⼀个字节的地址称为变量 a 的地址,也就是&a的值。对于前⾯讲到的整数、浮点数、字符,都要使⽤ & 获取它们的地址,scanf 会根据地址把读取到的数据写⼊内存。
我们不妨将它们的地址输出看⼀下:
#include
#include
int main()
{
int a='F';
int b=12;
int c=452;
printf("&a=%#x, &b=%#x, &c=%#x\n", &a, &b, &c);
system("pause");
return 0;
}
输出结果:
&a=0x18ff48, &b=0x18ff44, &c=0x18ff40
图:a、b、c 的内存地址
注意:这⾥看到的地址是虚拟地址,并不等于它在物理内存中的地址。虚拟地址是现代计算机因内存管理的需要才提出的概念,我们将在《C语⾔和内存》专题中详细讲解。
再来看⼀个 scanf 的例⼦:
#include
#include
int main()
{
int a, b, c;
scanf("%d %d", &a, &b);
printf("a+b=%d\n", a+b);
scanf("%d %d", &a, &b);
printf("a+b=%d\n", a+b);
scanf("%d, %d, %d", &a, &b, &c);
printf("a+b+c=%d\n", a+b+c);
scanf("%d is bigger than %d", &a, &b);
printf("a-b=%d\n", a-b);
system("pause");
return 0;
}
运⾏结果:
10 20↙
a+b=30
100 200↙
a+b=300
56,45,78↙
a+b+c=179
25 is bigger than 11↙
a-b=14
第⼀个 scanf() 的格式控制字符串为"%d %d",中间有⼀个空格,⽽我们却输⼊了10 20,中间有多个空格。第⼆个 scanf() 的格式控制字符串为"%d %d",中间有多个空格,⽽我们却输⼊了100 200,中间只有⼀个空格。这说明 scanf() 对输⼊数据之间的空格的处理⽐较宽松,并不要求空格数严格对应。
第三个 scanf() 的控制字符串为"%d, %d, %d",中间以逗号分隔,所以输⼊的整数也要以逗号分隔。
第四个 scanf() 要求整数之间以is bigger than分隔。
每次⽤户按下回车键,程序就会认为⽤户输⼊结束,scanf() 开始读取⽤户输⼊的内容,并根据格式控制字符串从中提取数据,只要⽤户输⼊的内容和格式控制字符串匹配,就能够正确提取。
本质上讲,⽤户输⼊的内容都是字符串,scanf() 完成的是从字符串中提取有效数据的过程。
连续读取与读取失败问题
在本节第⼀段⽰例代码中,我们⼀个⼀个地输⼊变量 a、b、c、d 的值,也就是说,每输⼊⼀个值就按⼀次回车键。现在我们改变输⼊⽅式,将四个变量的值⼀次性输⼊,如下所⽰:
12 60 10 23↙
a+b=72
c*d=230
可以发现,scanf() 也能正确读取。合情合理地猜测是,scanf() 没有抛弃多余的值,⽽是将它们保存在了某个地⽅,下次接着使⽤。
请⼤家继续看下⾯的代码:
#include
#include
int main()
{
int a=0, b=0;
scanf("a=%d", &a);
scanf("b=%d", &b);
printf("a=%d, b=%d\n", a, b);
system("pause");
return 0;
}
运⾏结果:
a=100↙
a=100, b=0
第⼀个 scanf() 能够正确读取到整数并赋值给变量 a,第⼆个 scanf() 好像被忽略了,什么也没做,b 的值没有发⽣变化。
这两个问题都和C语⾔输⼊缓冲区有关,我们将在《C语⾔缓冲区(缓存)详解》《结合C语⾔缓冲区谈scanf()函数》《C语⾔清空缓冲区》⼏节详细讲解。
输⼊单个字符
scanf ⽤于接收⽤户输⼊的各种数据,如果仅仅是输⼊单个字符,也可以使⽤ getchar()、getche() 或 getch()。
getchar() 使⽤⽰例:
#include
#include
int main()
{
char c;
c=getchar();
printf("c='%c'\n", c);
system("pause");
return 0;
}
运⾏结果:
#↙
c='#'
你也可以将第5、6⾏的语句合并为⼀个:
char c = getchar();
getche() 使⽤⽰例:
#include
#include
#include
int main()
{
char c=getche();
printf("c='%c'\n", c);
system("pause");
return 0;
}
运⾏结果:
#c='#'
⼤家亲⾃运⾏程序会发现,刚输⼊字符 #,getche() 就⽴即获取,不会等到⽤户按下回车键,所以运⾏结果中没有换⾏。⽽ getchar() 不是,它要等到⽤户按下回车键才能确认输⼊结束,所以运⾏结果中有换⾏。
getch() 使⽤⽰例:
#include
#include
#include
int main()
{
char c=getch();
printf("c='%c'\n", c);
system("pause");
return 0;
}
运⾏程序,输⼊ #,结果为:
c='#'
⼤家亲⾃运⾏程序会发现,getch() 和 getche() 类似,输⼊⼀个字符就⽴即获取,不会等待⽤户按下回车键。与 getche() 不同的
是,getch() 输⼊的 # 并没有显⽰出来。
在C语⾔中,将⽤户输⼊的内容显⽰在屏幕上叫做回显(Echo)。getchar()、getche() 是有回显的,⽽ getch() 没有回显。
回显在⼤部分情况下是有必要的,它能够与⽤户及时交互,让⽤户清楚地看到⾃⼰输⼊的内容。但在某些特殊情况下,我们却不希望有回显,例如输⼊密码,有回显是⾮常危险的,容易被偷窥。怎么给数组赋值
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论