vlambda博客
学习文章列表

C语言输入格式控制语法(完整)

「今天是学习C语言第 29 天」


当你选择了一种语言,意味着你还选择了一组技术、一个社区。——Joshua Bloch

# 输入格式控制

[]表示的字段可选,最基础的格式控制字符串是 %转换类型 。

1.格式控制字符串出现普通的白空字符时,表示输入时跳过白空字符;

2.出现其它普通字符序列时,也表示跳过对应的字符输入,如果不匹配则失败;

3.%开始的是转换说明符,将输入转换成对应的变量值保存;

4.参数应该是指向对应类型的指针。


# 语法:

%[标志*][最大域宽width][类型长度length]转换类型


1.标志*

表示跳过一个类型的数据的输入。

例如:

#include <stdio.h>int main(int argc, char* argv[]){ double d;  scanf("%*lf %lf", &d); printf("%lf\n",d); return 0;}
输入:100.1 200.2输出:200.200000

2.最大域宽

非零十进制整数,表示最多从该输入读取的字符数,如果数据超过,截断。

例如:

    scanf("%2d", &i);  // 输入:1000, i=10 

    scanf("%5d", &i);  // 输入:1000, i=1000


    char s[10];

    scanf("%5s", s);  // 输入:hellooo, s=hello


3.类型长度

类型长度使用字母说明输入对象的大小尺寸。

对于d,i,n,o,u,x转换类型,

h:short int 或 unsigned short int

l:long int 或 unsigned long int


对于e,f,g转换类型,

l: double

L: long double

默认是float。


4.转换类型

d

有符号十进制整数,输入的实参是指向整数的指针。

例如:

    int i,j;

    scanf("%d %d", &i, &j);

    printf("%d %d\n",i,j);

输入:100  -100

输出:100  -100


i

有符号整数,通用的,遇到十进制则输入十进制,遇到八进制则输入八进制,遇到十六进制输入十六进制。

输入的实参是指向整数的指针。

例如:

    int i,j,k;

    scanf("%i %i %i", &i,&j,&k);

    printf("%d %d %d\n",i,j,k);

输入:100  077  0xFF

输出:100  63 255

  

o

有符号八进制整数。

例如:

    int i;

    scanf("%o", &i);

    printf("%d\n",i);

输入:077  -077  

输出:63   -63   


u

无符号十进制整数。


x,X

有符号十六进制整数。


e,f,g,

有符号浮点数,参数为指向浮点数的指针。


s

输入非空白的字符串,直到读入第一个空白类字符为止。

例如:

    char a[10];

    scanf("%s", a);

    printf("%s\n",a);

输入:hello world

输出:hello

注:hello world相当于两个字符串。


[]

根据特定的字符集合,从输入的字符序列匹配最长的字符串。

从输入中获取匹配[]定义的字符集合的字符形成字符序列。

对于连接符号 - 处理是实现定义,当-字符出现在[]中间位置时,表示范围,有特殊意义。

[^] 是相反匹配,从输入中获取不在[]定义的字符集合中的字符。

例如:

    scanf("%[123]", a);  // 输入:12b2c34d

    printf("%s\n", a);   // 输出:12


    scanf("%[^123]", a);  // 输入:a123bdk

    printf("%s\n", a);   //  输出:a


    scanf("%[1-9]", a);  // 输入:1234567890abc9

    printf("%s\n", a);   // 输出:123456789


c

输入一个字符序列(不自动加入空字符),字符数有域宽规定,默认是1,输入一个字符。

例如:

    char c;

    scanf("%c", &c);  // 输入:a

    printf("%c", c);  // 输出:a


    char c[10];

    c[3] = ' ';

    scanf("%3c", &c);

    printf("%c %c %c %c",c[0],c[1],c[2],c[3]);

    输入:abcdefg

    输出:a b c


p

例如:

    void *p;

    scanf("%p", &p);   // 输入:10000

    printf("%p\n", p); // 输出:00010000


n

不消耗输入的字符序列,将当前截至到%n的已输入的字符数存储到实参中。

实参要求是指向整数的指针,指向%n不会增加函数fscanf指向返回的输入参数个数。

例如:

    int i;

    char c[100];

    int num = scanf("%s%n",c,&i);

    printf("%d %d\n",i,num);

    输入:hello

    输出:5 1

    结果分析:hello刚好是5个字符,统计出来存储到i中。


%

匹配输入的百分号%,消耗输入的普通字符%。

例如:

  int i,j;

  scanf("%d%%%d",&i,&j);

  printf("%d %d\n",i,j);

  输入:100%100

  输出:100 100


---------- End ----------

往期精彩推荐:




「喜欢C请赏个 赞    点击右下角 在看」