格式化输入用于从不同输入源中获取数据并根据格式化字符串 format
转换为对应的格式代码并存储在对应的类型中。
格式化输入函数
库函数中提供了 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
*/
编译运行后,输入 5
和 10
两个数值,两值之和是 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", 5, 10);
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
文件,可以看到该文件中写入的数据 5
和 10
,然后定位到文件开头,再使用 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 |
省略限定符时,会导致较长变量部分被初始化,或较短变量的邻近变量也被修改。转换所有 short
和 long
型整数值和 long double
型值时要使用适当限定符,使程序更具可移植性。
%c
把输入值转换为一个字符并读取。
char v;
scanf("%c", &v);
%d
把输入值转换为有符号十进制整数并读取。
int v;
scanf("%d", &v);
%i
根据前缀,将输入值转换为对应的进制数并读取,如十进制、八进制或十六进制等。
int v;
scanf("%i", &v);
运行后,输入 0x11
、011
或 11
都可以。
%o
把输入值转换八进制数并读取。
int v;
scanf("%o", &v);
%u
把输入值转换为十进制数并读取。
int v;
scanf("%u", &v);
%x
把输入值转换为十六进制并读取,与 %X
效果一样。
int v;
scanf("%x", &v);
%e、%f、%g
把输入值转换为浮点值并读取,如 3.14
或 3.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]
表示字符组合为 a
、b
、c
之外的所有字符。%[a-z]
表示字符从 a
到 z
的所有字符。
char s[50];
scanf("%[a-z]", s);
如上所示,运行后输入 hello,World!
,会在发现 ,
时停止,只会读取 hello
字符串。

原文始发于微信公众号(海人为记):一文讲解C语言格式化输入
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/27441.html