📜  C 中格式化和未格式化的输入输出函数及示例(1)

📅  最后修改于: 2023-12-03 15:29:44.455000             🧑  作者: Mango

C 中格式化和未格式化的输入输出函数

C提供了多种输入和输出函数,它们可以被分为格式化的输入输出函数和未格式化的输入输出函数。格式化的输入输出函数以指定的格式将数据转换成字符串,而未格式化函数则直接操作二进制数据。

格式化的输出函数
printf函数

该函数将根据指定的格式将数据转换成字符串并输出到标准输出。语法如下:

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
sprintf函数

该函数与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.
fprintf函数

该函数与printf函数类似,只是它将输出写入指定的文件流中。语法如下:

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

其中,stream参数是指向文件流的指针,可以是标准输出文件流stdout或标准错误文件流stderr,也可以是由fopen函数返回的文件流指针。以下是一个示例:

fprintf(stdout, "Hello, ");
fprintf(stderr, "World!\n");
// Hello, World!
格式化的输入函数
scanf函数

该函数将根据指定的格式从标准输入中读取数据,语法如下:

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);
sscanf函数

该函数与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);
未格式化的输出函数
putchar函数

该函数将一个字符输出到标准输出,语法如下:

int putchar(int c);

其中,c参数是要输出的字符。以下是一个示例:

putchar('H');
putchar('e');
putchar('l');
putchar('l');
putchar('o');
putchar('\n');
// Hello
puts函数

该函数将一个字符串输出到标准输出,并自动添加一个换行符。语法如下:

int puts(const char *s);

其中,s参数是要输出的字符串。以下是一个示例:

puts("Hello, World!");
// Hello, World!
fwrite函数

该函数将指定的二进制缓冲区中的数据写入到文件流中。语法如下:

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);
未格式化的输入函数
getchar函数

该函数从标准输入中读取一个字符并返回它的ASCII码值,语法如下:

int getchar(void);

以下是一个示例:

int c;
while ((c = getchar()) != EOF) {
    putchar(c);
}
gets函数

该函数从标准输入中读取一行字符串并存储到指定的缓冲区中,但是它没有长度检查,容易导致缓冲区溢出,不建议使用。语法如下:

char *gets(char *s);

其中,s参数是指向输出缓冲区的指针。以下是一个示例:

char buf[10];
gets(buf);    // 可能会发生缓冲区溢出
printf("%s\n", buf);
fread函数

该函数从文件流中读取指定长度的数据,并将数据存储到指定的缓冲区中。语法如下:

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);