scanf( )函数的格式化输入

函数原型:

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

1. 控制字符串和参数列表

跟printf( )一样,scanf( )使用控制字符串和参数列表。但和printf( )的区别是,printf( )函数使用变量名、变量和表达式;而scanf( )函数使用指向变量的指针

scanf( )函数所用的转换说明字符与printf( )所使用的几乎完全相同。主要区别在于printf( )把%f、%e、%E、%g和%G同时用于float类型和double类型,而scanf( )只把它们用于float类型,而用于double类型时要求使用l修饰符。

scanf的转换说明符
转换说明符 意义
%c 把输入解释成一个字符
%d 把输入解释成一个有符号十进制整数
%e,%f,%g,%a 把输入解释成一个浮点数(%a是C99标准)
%E,%F,%G,%A 把输入解释成一个浮点数(%A是C99标准)
%i 把输入解释成一个有符号十进制整数
%o 把输入解释成一个有符号八进制整数
%p 把输入解释成一个指针(一个地址)
%s 把输入解释成一个字符串:输入的内容以第一个非空白字符作为开始,并且包含直到下一个空白字符的全部字符
%u 把输入解释成一个无符号十进制整数
%x,%X 把输入解释成一个有符号十六进制整数

%a,%A使用p-计数法表示浮点数:整数部分使用十六进制数表示,小数部分使用2的幂次表示。

scanf的转换修饰符
修饰符 意义
* 滞后赋值
digit(s) 最大字段宽度:在达到最大字段宽度或者遇到第一个空白符时停止对输入项的读取
hh 把整数读作signed char或unsigned char
ll 把整数读作long long或unsinged long long(C99)
h,l或L

如果没有修饰符,d、i、o和x指示int类型,而e、f和g指示float类型。
修饰符h使d、i、o、x和u变更为对应的short类型,使e、f和g变更为指示double类型;
L使e、f和g变更为指示long double类型

2. 格式字符串中的常规字符

scanf( )函数允许您把普通字符放在格式字符串中。除了空格字符之外的普通字符一定要与输入字符串准确匹配。例如,如果把逗号放在两个说明符之间:

scanf("%d, %d", &n, &m);

则输入必须为如下形式才会被接受:

88, 121

格式字符串中的空格意味着跳过下一个输入项之前的任何空白符(但必须要有空白符,不可以没有)。

除了%c之外的说明符会自动跳过输入项之前的空格,所以scanf("%d%d", &n, &m)与scanf("%d %d", &n, &m)的行为是相同的。

但要注意%c会读取输入中的空白符,所以scanf("%c", &n)与scanf(" %c", &n)的行为是不同的。前者会读取输入中遇到的第一个(任意)字符,后者会先跳过空白符,读取遇到的第一个非空白字符。

3. *修饰符——滞后赋值

在scanf( )中的*和在printf( )中的含义截然不同。当把它放在%和说明符字母之前时,它使函数跳过相应的输入项目。程序示例:

/* skip.c -- 跳过输入的头两个整数 */
#include <stdio.h>

int main(void)
{
    int n;
    printf("Please enter three integers: \n");
    scanf("%*d %*d %d", &n);
    printf("The last integer was %d\n", n);

    return 0;
}

输入:2004 2005 2006

输出:2006

4. 返回值

scanf( )函数返回成功读入的项目的个数。如果它没有读取任何项目,会返回值0。当它检测到“文件结尾”时,会返回EOF。

原文地址:https://www.cnblogs.com/qwertWZ/p/2868888.html