Scanf函数,取地址符&和字符数组的联系 您所在的位置:网站首页 赋值语句合法格式 Scanf函数,取地址符&和字符数组的联系

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

2023-11-23 09:50| 来源: 网络整理| 查看: 265

个人网站: 欢迎来访~

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

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

#include 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的精度控制。

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有