Scanf函数,取地址符&和字符数组的联系

个人网站:
欢迎来访~

scanf函数的一般形式:scanf函数是C语言里一个标准的库函数,它的函数原型在头文件“stdio.h”中,与printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件。

scanf函数的一般形式为:scanf(“格式控制字符串”,地址列表);

其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址列表中给出各变量的地址。地址是由地址运算符“&”后跟变量名组成。

例:&a,&b;//分别表示变量a和变量b的地址。

变量地址是C编译系统分配的,用户不必关系具体地址是多少。

变量的地址和变量值的关系如下: a=567; //a为变量名,567是变量的值,&a是变量a的地址。

赋值语句左边是变量名,不能写地址,而scanf的本质也是给变量赋值,但要求写变量的地址,如&a。这两者在形式上是不同的。&是一个取地址运算符,&a是一个表达式,其功能是求变量的地址。

  • scanf函数中没有精度控制,如:scanf("%5.2f",&a);是非法的。不能企图用此语句输入小数为2的实数 ,但可以指定位数。
  • scanf函数要求给出变量地址,若给出变量名则会出错。如scanf("%d",a);是非法的,应改为scanf(”%d“,&a);才是合法的
  • 在输入多个数值数据时,若格式控制串中无非格式字符做输入数据之间的间隔则可用空格,TAB或回车做间隔。C编程在碰到空格,TAB,回车或非法数据(如对”%d“输入”12A“时,A即为非法数据)时,即认为该数据结束。
  • 在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符(空格也为字符)。
  • 如输入的数据与输出的类型不一致时,虽然编译能通过,但结果不正确。
例如:
scanf("%c%c%c",&a,&b,&c);

输入为:d e f

则把“d”赋予a“ ”赋予b,“e“赋予c。
只有输入为def时,才能把”d“赋予a,”e”赋予b,“f”赋予c。

描述:

C 库函数 int scanf(const char *format, ...) 从标准输入 stdin 读取格式化输入。

声明:

int scanf(const char *format, ...)

参数:

  • format -- 这是 C 字符串,包含了以下各项中的一个或多个:空格字符非空格字符 和 format 说明符。

format 说明符形式为:

[=%[*][width][modifiers]type=]

具体如下:

* :

这是一个可选的星号,表示数据是从流 stream 中读取的,但是可以被忽视,即它不存储在对应的参数中。 如:
scanf("%d %*d %d",&a,&b);
当输入为:1 2 3时,把1赋予a,2被跳过,3赋予b。

width :
这指定了在当前读取操作中读取的最大字符数。
例: scanf("%5d",&a);
输入: 12345678 则a=12345,其余部分被截去。
modifiers:
为对应的附加参数所指向的数据指定一个不同于整型(针对 d、i 和 n)、无符号整型(针对 o、u 和 x)或浮点型(针对 e、f 和 g)的大小: h :短整型(针对 d、i 和 n),或无符号短整型(针对 o、u 和 x) l :长整型(针对 d、i 和 n),或无符号长整型(针对 o、u 和 x),或双精度型(针对 e、f 和 g) L :长双精度型(针对 e、f 和 g)
长整型数据(如%ld) 和双精度浮点数(如%lf) 。
type :
一个字符,指定了要被读取的数据类型以及数据读取方式

返回值:

如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。 end of file为Ctrl+z 或者Ctrl+d。

#include<stdio.h>
int main(void)
{
    int a,b,c;
 
    printf("请输入三个数字:");
    scanf("%d, %d, %d",&a,&b,&c);
    printf("%d, %d, %d\n",a,b,c);
    return 0;
}结果如下:
请输入三个数字:1, 2, 3
1, 2, 3</code></pre>

1、&a、&b、&c 中的 & 是地址运算符,分别获得这三个变量的内存地址。
2、%d%d%d 是按十进值格式输入三个数值。输入时,在两个数据之间可以用一个或多个空格、tab 键、回车键分隔。 如果使用 , 来分隔输入的 %d, 相应的输入时也需要添加
3. 输入时 , 前一定要紧跟在数字后面,数字与 , 之间不能有空格。在用 %c 输入时,空格和"转义字符"均作为有效字符。

#include <stdio.h>
 
int main()
{
   char str1[20], str2[30];
 
   printf("请输入用户名:");
   scanf("%s", str1);
 
   printf("请输入您的网站:");
   scanf("%s", str2);
 
   printf("输入的用户名:%s\n", str1);
   printf("输入的网站:%s", str2);
   
   return(0);
}
结果如下://
请输入用户名:admin
请输入您的网站:www.xxx.com
输入的用户名:admin
输入的网站:www.xxx.com

字符数组为什么输入时不用加&?

数组名代表数组的首地址,是一个指针,所以不用加&符号。如果是引用数组的元素,就必须得加&符。还有字符串是随机址分配。

&是表示取地址,但是char * s(或char s[10],其中s是指针,是所保存的数组的首位的地址,它本身就是一个地址,所以可以用scanf("%s",s)来输入,其中%s是针对字符数组特有的,
如下代码 int a[100];scanf("%d",a);也是可以运行的,但是输入的数据在a[0]中,因为是%d

换句话说,字符数组本身就是地址

注意:

  • 在高版本的 Visual Studio 编译器中,scanf 被认为是不安全的,被弃用,应当使用scanf_s代替 scanf。
  • 对于字符串数组或字符串指针变量,由于数组名可以转换为数组和指针变量名本身就是地址,因此使用scanf()函数时,不需要在它们前面加上"&"操作符。
  • 可以在格式化字符串中的"%"各格式化规定符之间加入一个整数,表示任何读操作中的最大位数。
  • scanf函数中没有类似printf的精度控制。

更多的地址信息在了解指针后会有更深的认识



  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值