📅  最后修改于: 2023-12-03 15:29:44.455000             🧑  作者: Mango
C提供了多种输入和输出函数,它们可以被分为格式化的输入输出函数和未格式化的输入输出函数。格式化的输入输出函数以指定的格式将数据转换成字符串,而未格式化函数则直接操作二进制数据。
该函数将根据指定的格式将数据转换成字符串并输出到标准输出。语法如下:
int printf(const char *format, ...);
其中,format
参数是一个格式化字符串,它包含了要输出的文本和格式指示符,而后面的可变参数则是要格式化的数据。以下是一些格式指示符和它们的含义:
| 格式指示符 | 数据类型 | 输出格式 |
| :---: | :---: | :---: |
| %d
| int | 十进制整数 |
| %x
| unsigned int | 十六进制整数 |
| %u
| unsigned int | 十进制无符号整数 |
| %f
| double | 十进制浮点数 |
| %c
| char | 单个字符 |
| %s
| char * | 字符串 |
| %p
| void * | 指向地址的指针 |
以下是几个示例:
int age = 24;
double height = 174.5;
char *name = "Tom";
printf("My name is %s, I'm %d years old, and I'm %.2lf meters tall.\n", name, age, height);
// My name is Tom, I'm 24 years old, and I'm 174.50 meters tall.
int a = 123;
printf("Decimal: %d\n", a); // Decimal: 123
printf("Hexadecimal: %x\n", a); // Hexadecimal: 7b
printf("Unsigned decimal: %u\n", a); // Unsigned decimal: 123
char b = 'A';
printf("Char: %c\n", b); // Char: A
void *ptr = &a;
printf("Pointer: %p\n", ptr); // Pointer: 000000000061FE1C
该函数与printf
函数类似,只是它将格式化的字符串输出到指定的缓冲区中。语法如下:
int sprintf(char *str, const char *format, ...);
其中,str
参数是指向输出缓冲区的指针。以下是一个示例:
char buf[100];
int n = sprintf(buf, "Hello, %s!", "World");
printf("%s\n%d characters written.\n", buf, n);
// Hello, World!
// 13 characters written.
该函数与printf
函数类似,只是它将输出写入指定的文件流中。语法如下:
int fprintf(FILE *stream, const char *format, ...);
其中,stream
参数是指向文件流的指针,可以是标准输出文件流stdout
或标准错误文件流stderr
,也可以是由fopen
函数返回的文件流指针。以下是一个示例:
fprintf(stdout, "Hello, ");
fprintf(stderr, "World!\n");
// Hello, World!
该函数将根据指定的格式从标准输入中读取数据,语法如下:
int scanf(const char *format, ...);
其中,format
参数与printf
函数中的一样,指定了读取数据的格式,后面的可变参数则是指向需要存储数据的变量。以下是一些格式指示符的示例:
int age;
double height;
char name[20];
scanf("My name is %s, I'm %d years old, and I'm %lf meters tall.", name, &age, &height);
printf("%s is %d years old and %.2lf meters tall.\n", name, age, height);
int a;
unsigned int b;
scanf("%d %u", &a, &b);
printf("a = %d, b = %u\n", a, b);
char buf[10];
scanf("%9s", buf); // 限制读取9个字符
printf("%s\n", buf);
该函数与scanf
函数类似,只是它从指定的字符串中读取数据。语法如下:
int sscanf(const char *str, const char *format, ...);
其中,str
参数是指定的字符串。以下是一个示例:
char buf[] = "Tom is 24 years old and 174.5 meters tall.";
char name[20];
int age;
double height;
sscanf(buf, "%s is %d years old and %lf meters tall.", name, &age, &height);
printf("%s is %d years old and %.2lf meters tall.\n", name, age, height);
该函数将一个字符输出到标准输出,语法如下:
int putchar(int c);
其中,c
参数是要输出的字符。以下是一个示例:
putchar('H');
putchar('e');
putchar('l');
putchar('l');
putchar('o');
putchar('\n');
// Hello
该函数将一个字符串输出到标准输出,并自动添加一个换行符。语法如下:
int puts(const char *s);
其中,s
参数是要输出的字符串。以下是一个示例:
puts("Hello, World!");
// Hello, World!
该函数将指定的二进制缓冲区中的数据写入到文件流中。语法如下:
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
其中,ptr
参数是指向要写入的数据缓冲区的指针,size
参数是每个元素的大小,count
参数是要写入的元素个数,stream
参数是指向要写入的文件流的指针。以下是一个示例:
int a[3] = {1, 2, 3};
FILE *fp = fopen("a.bin", "wb");
fwrite(a, sizeof(int), 3, fp);
fclose(fp);
该函数从标准输入中读取一个字符并返回它的ASCII码值,语法如下:
int getchar(void);
以下是一个示例:
int c;
while ((c = getchar()) != EOF) {
putchar(c);
}
该函数从标准输入中读取一行字符串并存储到指定的缓冲区中,但是它没有长度检查,容易导致缓冲区溢出,不建议使用。语法如下:
char *gets(char *s);
其中,s
参数是指向输出缓冲区的指针。以下是一个示例:
char buf[10];
gets(buf); // 可能会发生缓冲区溢出
printf("%s\n", buf);
该函数从文件流中读取指定长度的数据,并将数据存储到指定的缓冲区中。语法如下:
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
其中,ptr
参数是指向要存储数据的缓冲区的指针,size
参数是每个元素的大小,count
参数是要读取的元素个数,stream
参数是指向要读取的文件流的指针。以下是一个示例:
int a[3];
FILE *fp = fopen("a.bin", "rb");
fread(a, sizeof(int), 3, fp);
fclose(fp);