个人网站:
欢迎来访~
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的精度控制。
更多的地址信息在了解指针后会有更深的认识