C

标准库函数

fprintf 输出到流中

描述

C 库函数 int fprintf(FILE *stream, const char *format, …) 发送格式化输出到流 stream 中。

声明

下面是 fprintf() 函数的声明。

1
int fprintf(FILE *stream, const char *format, ...)

参数

  • stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
  • format – 这是 C 字符串,包含了要被写入到流 stream 中的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。format 标签属性是 %[flags][width][.precision][length]specifier,具体讲解如下:

返回值

如果成功,则返回写入的字符总数,否则返回一个负数。

实例

下面的实例演示了 fprintf() 函数的用法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <stdlib.h>

int main()
{
FILE * fp;

fp = fopen ("file.txt", "w+");
fprintf(fp, "%s %s %s %d", "We", "are", "in", 2014);

fclose(fp);

return(0);
}

让我们编译并运行上面的程序,这将创建文件 file.txt,它的内容如下:

1
We are in 2014

atoi 字符串转换成整数

描述

C 库函数 int atoi(const char *str) 把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。

声明

下面是 atoi() 函数的声明。

1
int atoi(const char *str)

参数

  • str – 要转换为整数的字符串。

返回值

该函数返回转换后的长整数,如果没有执行有效的转换,则返回零。

实例

下面的实例演示了 atoi() 函数的用法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
int val;
char str[20];

strcpy(str, "98993489");
val = atoi(str);
printf("字符串值 = %s, 整型值 = %d\n", str, val);

strcpy(str, "runoob.com");
val = atoi(str);
printf("字符串值 = %s, 整型值 = %d\n", str, val);

return(0);
}

让我们编译并运行上面的程序,这将产生以下结果:

1
2
字符串值 = 98993489, 整型值 = 98993489
字符串值 = runoob.com, 整型值 = 0

printf

1
int printf ( const char * format, ... );

将format 指向的 C 字符串写入标准输出 ( stdout )。如果format包含格式说明符(以%开头的子序列),则format后面的附加参数将被格式化并插入到结果字符串中,替换它们各自的说明符。

格式化

1
%[flags][width][.precision][length]specifier

specifier

specifierOutputExample
d or iSigned decimal integer(有符号十进制整数)392
uUnsigned decimal integer7235
oUnsigned octal (无符号八进制)610
xUnsigned hexadecimal integer (无符号十六进制整数)7fa
XUnsigned hexadecimal integer (uppercase)7FA
fDecimal floating point, lowercase (十进制浮点数,小写)392.65
FDecimal floating point, uppercase392.65
eScientific notation (mantissa/exponent), lowercase (科学记数法(尾数/指数),小写)3.9265e+2
EScientific notation (mantissa/exponent), uppercase3.9265E+2
gUse the shortest representation: %e or %f (使用最短的表示:%e%f)392.65
GUse the shortest representation: %E or %F392.65
aHexadecimal floating point, lowercase (十六进制浮点数,小写)-0xc.90fep-2
AHexadecimal floating point, uppercase-0XC.90FEP-2
cCharactera
sString of characterssample
pPointer addressb8000000
nNothing printed.
The corresponding argument must be a pointer to a signed int.
The number of characters written so far is stored in the pointed location.
%A % followed by another % character will write a single % to the stream.%

flags

格式说明符 还可以按顺序包含子说明符:flagswidth.precisionmodifiers(这个是什么?),它们是可选的并遵循以下规范:

flagsdescription
-Left-justify within the given field width; Right justification is the default (see width sub-specifier).
(在给定的字段宽度内左对齐;右对齐是默认设置(请参阅宽度子说明符)。)
+Forces to preceed the result with a plus or minus sign (+ or -) even for positive numbers. By default, only negative numbers are preceded with a - sign.
(即使对于正数,也强制在结果前面加上加号或减号(+-)。默认情况下,只有负数前面带有-号。)
(space)If no sign is going to be written, a blank space is inserted before the value.
(如果不写入符号,则在值之前插入一个空格。)
#Used with o, x or X specifiers the value is preceeded with 0, 0x or 0X respectively for values different than zero.
Used with a, A, e, E, f, F, g or G it forces the written output to contain a decimal point even if no more digits follow. By default, if no digits follow, no decimal point is written.
(与oxX说明符一起使用时,该值前面分别带有00x0X,用于表示不同于零的值。
aAeEfFgG一起使用,即使后面没有数字,它也会强制书面输出包含小数点。默认情况下,如果后面没有数字,则不写入小数点。)
0Left-pads the number with zeroes (0) instead of spaces when padding is specified (see width sub-specifier).
指定填充时,用零(0)而不是空格填充数字(请参阅宽度子说明符)。

width

widthdescription
(number)Minimum number of characters to be printed. If the value to be printed is shorter than this number, the result is padded with blank spaces. The value is not truncated even if the result is larger.
(要打印的最小字符数。如果要打印的值比这个数字短,结果用空格填充。即使结果较大,该值也不会被截断。)
*The width is not specified in the format string, but as an additional integer value argument preceding the argument that has to be formatted.
(宽度未在格式字符串中指定,而是作为必须格式化的参数之前的附加整数值参数。)

.precision

.precisiondescription
.numberFor integer specifiers (d, i, o, u, x, X): precision specifies the minimum number of digits to be written. If the value to be written is shorter than this number, the result is padded with leading zeros. The value is not truncated even if the result is longer. A precision of 0 means that no character is written for the value 0. For a, A, e, E, f and F specifiers: this is the number of digits to be printed after the decimal point (by default, this is 6). For g and G specifiers: This is the maximum number of significant digits to be printed. For s: this is the maximum number of characters to be printed. By default all characters are printed until the ending null character is encountered. If the period is specified without an explicit value for precision, 0 is assumed.
对于整数说明符(diouxX):精度指定要写入的最小位数。如果要写入的值小于此数字,则结果用前导零填充。即使结果更长,该值也不会被截断。精度0意味着不为值0写入任何字符。
对于aAeEfF说明符:这是要打印的位数小数点后(默认为 6)。
对于gG说明符:这是要打印的最大有效位数。
对于s:这是要打印的最大字符数。默认情况下,所有字符都会打印,直到遇到结束的空字符。
如果指定了周期而没有明确的精度值,则假定为0 。
.*The precision is not specified in the format string, but as an additional integer value argument preceding the argument that has to be formatted.
精度未在格式字符串中指定,而是作为必须格式化的参数之前的附加整数值参数。

长度子说明符修改数据类型的长度 。这是一个图表,显示了用于解释有和没有长度说明符的相应参数的类型(如果使用不同的类型,则执行适当的类型提升或转换,如果允许):

specifiers
lengthd iu o x Xf F e E g G a Acspn
(none)intunsigned intdoubleintchar*void*int*
hshort intunsigned short intshort int*
llong intunsigned long intwint_twchar_t*long int*
Llong double
↓C99↓↓C99↓↓C99↓↓C99↓↓C99↓↓C99↓↓C99↓↓C99↓
hhsigned charunsigned charsigned char*
lllong long intunsigned long long intlong long int*
jintmax_tuintmax_tintmax_t*
zsize_tsize_tsize_t*
tptrdiff_tptrdiff_tptrdiff_t*

杂乱

stderr stdout

  • stdout – 标准输出设备 stdout。

  • stderr – 标准错误输出设备

两者默认向屏幕输出。 但如果用转向标准输出到磁盘文件,则可看出两者区别。stdout输出到磁盘文件,stderr在屏幕。

转向标准输出到磁盘文件tmp.txt
my.exe > tmp.txt

在默认情况下,stdout是行缓冲的,他的输出会放在一个buffer里面,只有到换行的时候,才会输出到屏幕。而stderr是无缓冲的,会直接输出。

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
int main()
{
fprintf(stdout,"Group");
fprintf(stderr,"XiyouLinux");
}

/*
linux下,第一次会输出XiYouLinuxGroup,是因为stdout将输出的Group放到了缓冲区当中直到程序结束在将缓冲区中的数据刷新出来。
*/

Show me you code

全局变量会默认被设置成0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <stdlib.h>

int ga=0;
int gb;

void testFun(void) {
int a=0;
int b;

printf("%d %d %d %d \r\n", a, b, ga, gb);
}

int main()
{
printf("Hello world!\n");

for (int i = 0; i < 10; i++)
{
testFun();
}

return 0;
}

output:

1
2
3
4
5
6
7
8
9
10
11
Hello world!
0 16 0 0
0 16 0 0
0 16 0 0
0 16 0 0
0 16 0 0
0 16 0 0
0 16 0 0
0 16 0 0
0 16 0 0
0 16 0 0

C
https://www.oikiou.top/2020/3dd7ffa7/
作者
Oikiou
发布于
2020年8月8日
许可协议