该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
零基础C语言入门008——变量的地址、scanf()格式化输入函数
变量的地址:
每个变量都对应一块内存空间,计算机每一个空间都有唯一的一个标志代表着,本质是一个数,从0开始到很大的一个数,32位程序是2ˆ32-1,64位程序是2ˆ64-1。这个数就是地址,就像我们家的地址一样。
#include
int main(void)
{
int a = 12;
printf("%p\n",&a);
system("pause");
return 0;
}
&表示取地址,%p表示打印16进制的地址
注意,这个地址值,不同的编译器结果都可能 不一样,同一台电脑同一个编译器,再次编译结果也可能 不一样,内存随机分配。
学会了打印(也就是输出),能在程序中打印变量的值了,但也只能打印我们事先在程序中写好的值。
能不能在程序过程中自己手动用键盘输入变量的值,再打印出来呢?
这时我们就要学习scanf()标准输入函数。格式如下:
scanf("%d",&a);
&是取址符。
scanf("%d",&a);的意思就是你从键盘输入一个整型变量的值,它会自动存放到变量a那个地址。也就是它会找到那个标记为a的盒子,然后把值放进去。
为什么printf()没&,因为它是直接输出,a变量的地址已经事先知道,而scanf() 我们输入数据都是直接输入到内存里的。变量a的值从外部获取,得先知道变量a的地址,知道地址你才好把值放进去。且标准输入函数的格式需要,后面要的是地址信息。
每个变量名都有对应的地址,变量名只是地址的别名,就好像外号一样,之所以用变量名而不用地址名,因为变量名比地址名好记,方便。而地址名是数字,你不可能知道地址的十六进制数字00x0是什么。
扯远了,内存地址在学指针的时候你就会知道,现在先别管这些,知道太细反而越弄越糊涂,你现在就只需要知道scanf()的格式scanf("%d",&a);和print()差不多,但是变量名前一定要加&,除了scanf("%s",a);字符串格式就不需要,这也跟指针有关系,现在先别管,你只要知道除了%S,其他类型的变量都要在前面加&, 引号里面注意不要加\n,没必要
printf()是格式化输出函数,我想这个你们应该很容易掌握
scanf()是格式化输入函数,顾名思义,就是你在输入时必须按照指定的格式输入才行
#include
int main(void)
{
int num=5;
printf(“前:%d\n”, num);
//前面加个输入提示
printf(“请输入一个整数:”);
scanf("%d", &num);
printf(“后:%d\n”,num);
system(“pause”);
return 0;
}
#include
main(void)
{
int a,b;
printf(“请输入两个数\n”);
scanf("%d%d",&a,&b);
printf(“a=%d,b=%d\n”,a,b);
system(“pause”);
return 0; }
这个是连续输入
输入1 回车 输入2 回车
或者
输入1 空格 输入2 回车
注意:最后的回车是必要的,意味着完成输入
现在再改变一下
把scanf("%d%d",&a,&b);改成scanf("%d,%d",&a,&b);中间加一个逗号
那么,再怎么输入?
注意:出现怎么打什么
先输入1,再输入,(逗号),再输入2 回车
就是这样:1,2 回车
结果也是a=1,b=2,如果输入1就回车,那么b的值就没办法获取,而是你想不到的结果(这个自己去运行)
无论出现什么你就照打什么
如scanf("%d;%d",&a,&b);你就打1分号2 回车
哪怕是一个字母一个符号
因为scanf跟printf不同,printf你双引号里面有什么,他都会打印在屏幕。效果直观,出现什么偏差可以对应着改双引号里面的内容。而scanf双引号里面出现的元素必须你手动输入,且一个不漏,一个不多,一一对应。否则就获取错误的值。经常性的错误有scanf("%d,%d,%d",a,b,c)三个%d用逗号或其他符号隔开,scanf(“a=%d,b=%d,c=%d”,a,b,c)。结尾或用\n。然后键盘输入的时候又没输入逗号。或者scanf("%d%d%d",a,b,c)输入的时候又加逗号隔开,这样b的值就是你输入的第二个逗号。且很难发现。
所以scanf里面除了%d%d%d什么符号都不要带。逗号和\n都不需要。输入的时候,输入一个就按一下回车表示完成一个,中间不要加任何符号。如果你非要手贱不加不舒服,那么输入的时候就必需对应的输入
scanf("%d%d",&a,&b);
printf("a=%d,b=%d\n",a,b);
#include
int main(void)
{
int a;
float b;
char c;
printf("请输入a的值:");
scanf("%d",&a);
printf("请输入b的值:");
scanf("%f",&b);
printf("请输入c的值:");
scanf("%c",&c);
printf("a的值为:%d,b的值为:%f,C的值为:%c\n",a,b,c);
system("pause");
return 0;
}
这个是正确的吗?你运行的时候你就会发现,变量c没办法输入了,程序直接结束
哪里有问题?
下面我们来分析
首先程序显示 请输入a的值:
我们输入1,在按回车键
又会显示 请输入b的值:
我们输入1.1 按回车
这时候程序就会显示
请输入c的值:a的值为:1,b的值为:1.100000,C的值为:
这是为什么?别忘了之前说过,空格和回车也是字符
开始输入了1到了变量a里,按回车,继续下一个输入
又输入了1.1到了变量b里
此时再按回车的话,就会被scanf接收了,因为变量c是字符格式,回车也是字符,自动存到变量c里
非字符变量,用scanf连续输入,按空格或回车会等待下一个输入
但是字符和字符串变量,scanf会直接接收空格和回车
怎么解决?在%c前面加一个空格,就是这样scanf(" %c",&c);
#include
int main(void)
{
int a;
float b;
char c;
printf("请输入a的值:");
scanf("%d",&a);
printf("请输入b的值:");
scanf("%f",&b);
printf("请输入c的值:");
scanf(" %c",&c);
printf("a的值为:%d,b的值为:%f,C的值为:%c\n",a,b,c);
system("pause");
return 0;
}
这样程序就能正常按我们意图运行。