一文讲解C语言格式化输入

格式化输入用于从不同输入源中获取数据并根据格式化字符串 format 转换为对应的格式代码并存储在对应的类型中。

一文讲解C语言格式化输入

格式化输入函数

库函数中提供了 scanf 几种函数用于实现格式化输入。

scanf

C语言提供了 scanf 函数用于从标准输入中读取,其原型如下所示。

int scanf(char const *format, ...);
  • format:格式化字符串,其中包含格式代码。

scanf 函数在格式字符串 format 的控制下,将输入源读取的内容转换为 format 中对应的格式代码,然后存入以输入参数的值为地址的变量中。

int a, b;
printf("input two values and caculate their sumn");
scanf("%d %d", &a, &b);
int sum = a + b;
printf("the sum of two values is %dn", sum);

/*
input two values and caculate their sum
5 10
the sum of two values is 15
*/

编译运行后,输入 510 两个数值,两值之和是 15。其中, &a&b& 符号是地址运算符。

fscanf

库函数中提供的 fscanf 函数,其输入源是作为参数给出的流,函数原型如下所示。

int fscanf(FILE *stream, char const *format, ...);
  • stream:指向 FILE 对象的指针。
  • format:格式化字符串,其中包含格式代码。

fscanf 函数在格式字符串 format 的控制下,将从流 stream中读取的内容转换为 format 中对应的格式代码,然后存入以输入参数的值为地址的变量中。

#include <stdio.h>
#include <stdlib.h>

int main() {

    FILE *fp;

    int a, b;

    fp = fopen("fscanf.txt""r+");    // 以可读写方式打开,文件不存在,则返回NULL

    if (fp == NULL) {
        perror("fopen");
        exit(EXIT_FAILURE);
    }
    
    printf("input two values and caculate their sumn");
    fprintf(fp, "%d %d"510);
    
    rewind(fp);  // 返回文件开始位置
    
    fscanf(fp, "%d %d", &a, &b);
    
    int sum = a + b;
    printf("the sum of a and b is %dn", sum);
    if (fclose(fp) != 0) {
        perror("fclose");
        exit(EXIT_FAILURE);
    }
    return 0;
}
/*
input two values and caculate their sum
a=5, b=10
the sum of a and b is 15
*/

打开 fscanf.txt 文件,可以看到该文件中写入的数据 510,然后定位到文件开头,再使用 fscanf 逐个读取并计算,之后打印出结果。

sscanf

库函数提供的  sscanf 的原型如下所示。

int sscanf(char const *src, char const *format, ...);
  • src:要数据读取的字符串。
  • format:格式化字符串,其中包含格式代码。

sscanf 函数在格式字符串 format 的控制下,将从字符数组 src 中读取的内容转换为 format 中对应的格式代码,然后存入以输入参数的值为地址的变量中。

char words[] = "5 10";
int a, b;
sscanf(words, "%d %d", &a, &b);
int sum = a + b;
printf("the sum of %d and %d is %d", a, b, sum);    // the sum of 5 and 10 is 15

格式代码

格式化字符串 format 可能包含下列内容:

  • 空白字符——它们与输入中的零个或多个空白字符匹配,在处理过程中将被忽略。
  • 格式代码——它们指定函数如何解释接下来的输入字符。
  • 其他字符——任何其他字符出现在格式字符串中时,下一个输入字符要与它匹配。如果匹配,该输入字符会随后丢弃;如果不匹配,函数就不再读取直接返回。

格式代码的一般形式如下所示。

%[*][width][modifier] type
  • *:可选的星号。表示转换后读入的值被丢弃,不存储在对应的参数中。
  • width:可选的宽度。非负整数,用于限制被读取的需要转换的字符的个数。如果未给出宽度,函数就连续读入字符直到预见输入中的下一个空白字符,如 %4d
  • modifier:可选的限定符。用于修改有些格式转换的含义。
  • type:格式类型。如 %d 中的 d,将读取的值转换为整型值。

限定符 modifier 的目的是为了限定参数的长度,如下所示。

格式码 h l L
d, i, n short long
o, u, x unsigned short unsigned long
e, f, g
double long double

省略限定符时,会导致较长变量部分被初始化,或较短变量的邻近变量也被修改。转换所有 shortlong 型整数值和 long double 型值时要使用适当限定符,使程序更具可移植性。

%c

把输入值转换为一个字符并读取。

char v;
scanf("%c", &v);

%d

把输入值转换为有符号十进制整数并读取。

int v;
scanf("%d", &v);

%i

根据前缀,将输入值转换为对应的进制数并读取,如十进制、八进制或十六进制等。

int v;
scanf("%i", &v);

运行后,输入 0x1101111都可以。

%o

把输入值转换八进制数并读取。

int v;
scanf("%o", &v);

%u

把输入值转换为十进制数并读取。

int v;
scanf("%u", &v);

%x

把输入值转换为十六进制并读取,与 %X效果一样。

int v;
scanf("%x", &v);

%e、%f、%g

把输入值转换为浮点值并读取,如 3.143.14e1

float v;
scanf("%e", &v);

%s

读取一串非空白字符。参数必须指向一个足够大的字符数组。当发现空白时输入就停止,符串后面会自动加上终止符。

char s[10];
scanf("%s", s);

如上所示,运行后输入 Hello, World! ,会发现空白符停止,只会读取 Hello, 字符串。

%p

把输入值转换为一个指针地址并读取。

void *p;
scanf("%p", p);

转换方式因编译器而异,转换结果和 printf 使用 %p 格式打印的字符的值是相同的。

%[xxx]

根据给定组合的字符从输入中读取一串字符。参数必须指向一个足够大的字符数组。当遇到第 1 个不再给定组合中出现的字符时,输入就停止。字符串后面会自动加终止符。如 %[^abc] 表示字符组合为 abc 之外的所有字符。%[a-z] 表示字符从 az 的所有字符。

char s[50];
scanf("%[a-z]", s);

如上所示,运行后输入 hello,World!,会在发现 , 时停止,只会读取 hello 字符串。



一文讲解C语言格式化输入


原文始发于微信公众号(海人为记):一文讲解C语言格式化输入

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/27441.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!