C库 —— <stdio.h>

引言

在C语言编程中,标准输入输出库 <stdio.h> 是最常用和最基本的库之一。它提供了一组函数,用于处理输入和输出操作,包括读取和写入字符、字符串、格式化输出和文件操作等。理解和掌握 <stdio.h> 库的功能对于每一个C语言程序员来说都是至关重要的。本文将详细介绍 <stdio.h> 库的各个方面,包括其函数、用法以及在实际编程中的应用。

<stdio.h> 库的基本功能

<stdio.h> 库包含许多重要的函数,这些函数可以分为以下几类:

1. 标准输入输出函数

函数描述
printf向标准输出打印格式化字符串
scanf从标准输入读取格式化输入
putchar向标准输出写入一个字符
getchar从标准输入读取一个字符
puts向标准输出写入一个字符串并换行
gets从标准输入读取一行字符串

2. 文件操作函数

函数描述
fopen打开文件
fclose关闭文件
fread从文件读取数据
fwrite向文件写入数据
fscanf从文件读取格式化输入
fprintf向文件写入格式化输出
fgets从文件读取字符串
fputs向文件写入字符串

3. 格式化输入输出函数

函数描述
sprintf将格式化输出写入字符串
sscanf从字符串读取格式化输入
snprintf将格式化输出写入字符串,限定最大长度

4. 字符和字符串操作函数

函数描述
fgetc从文件读取一个字符
fputc向文件写入一个字符
ungetc将字符退回到输入流
gets_s安全读取字符串(C11标准引入)

5. 错误处理函数

函数描述
perror打印错误信息
clearerr清除文件流的错误标志
feof检查文件流是否到达文件末尾
ferror检查文件流是否发生错误

我们将逐一介绍这些函数的详细内容及其使用方法。

1. 标准输入输出函数

标准输入输出函数主要用于从标准输入(通常是键盘)读取数据和向标准输出(通常是屏幕)写入数据。常用的标准输入输出函数有:

  • printf:向标准输出打印格式化字符串。
  • scanf:从标准输入读取格式化输入。
  • putchar:向标准输出写入一个字符。
  • getchar:从标准输入读取一个字符。
  • puts:向标准输出写入一个字符串并换行。
  • gets:从标准输入读取一行字符串。
printf 函数

printf 函数是C语言中最常用的输出函数,用于格式化输出数据。其基本语法如下:

int printf(const char *format, ...);
  • format:格式字符串,包含普通字符和格式说明符。
  • ...:可变参数,用于指定要输出的值。

常用的格式说明符包括:

  • %d:整数
  • %f:浮点数
  • %s:字符串
  • %c:字符
#include <stdio.h>

int main() {
    int num = 10;
    float pi = 3.14;
    char ch = 'A';
    char str[] = "Hello, World!";

    printf("Integer: %d\n", num);
    printf("Float: %.2f\n", pi);
    printf("Character: %c\n", ch);
    printf("String: %s\n", str);

    return 0;
}
scanf 函数

scanf 函数用于从标准输入读取格式化数据。其基本语法如下:

int scanf(const char *format, ...);

  • format:格式字符串,包含格式说明符。
  • ...:指针参数,用于存储读取的值。

示例代码:

#include <stdio.h>

int main() {
    int num;
    float pi;
    char ch;
    char str[100];

    printf("Enter an integer: ");
    scanf("%d", &num);
    printf("Enter a float: ");
    scanf("%f", &pi);
    printf("Enter a character: ");
    scanf(" %c", &ch);  // 注意:这里有一个空格,防止读取换行符
    printf("Enter a string: ");
    scanf("%s", str);

    printf("You entered:\n");
    printf("Integer: %d\n", num);
    printf("Float: %.2f\n", pi);
    printf("Character: %c\n", ch);
    printf("String: %s\n", str);

    return 0;
}

putchargetchar 函数

putchar 函数用于向标准输出写入一个字符,其基本语法如下:

int putchar(int ch);

getchar 函数用于从标准输入读取一个字符,其基本语法如下:

int getchar(void);

int getchar(void);

示例代码:

#include <stdio.h>

int main() {
    char ch;

    printf("Enter a character: ");
    ch = getchar();
    printf("You entered: ");
    putchar(ch);
    putchar('\n');

    return 0;
}

putsgets 函数

puts 函数用于向标准输出写入一个字符串并换行,其基本语法如下:

int puts(const char *str);

gets 函数用于从标准输入读取一行字符串,其基本语法如下:

char *gets(char *str);

注意gets 函数由于安全性问题(缓冲区溢出)在C11标准中已被弃用,推荐使用 fgets 代替。

示例代码:

#include <stdio.h>

int main() {
    char str[100];

    printf("Enter a string: ");
    gets(str);
    printf("You entered: ");
    puts(str);

    return 0;
}

2. 文件操作函数

<stdio.h> 库提供了一组函数,用于文件的打开、关闭、读取和写入操作。这些函数包括:

  • fopen:打开文件
  • fclose:关闭文件
  • fread:读取文件
  • fwrite:写入文件
  • fscanf:从文件读取格式化输入
  • fprintf:向文件写入格式化输出
  • fgets:从文件读取字符串
  • fputs:向文件写入字符串
文件打开和关闭

fopen 函数用于打开文件,其基本语法如下:

FILE *fopen(const char *filename, const char *mode);

  • filename:要打开的文件名
  • mode:文件打开模式,如 "r"(只读)、"w"(写入)、"a"(追加)等。

fclose 函数用于关闭文件,其基本语法如下:

int fclose(FILE *stream);

示例代码:

#include <stdio.h>

int main() {
    FILE *file;

    file = fopen("example.txt", "w");
    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    fprintf(file, "Hello, World!\n");
    fclose(file);

    return 0;
}

文件读取和写入

freadfwrite 函数用于读取和写入二进制文件,其基本语法如下:

size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);

  • ptr:数据缓冲区
  • size:每个数据项的大小
  • count:要读取或写入的数据项数目
  • stream:文件指针

示例代码:

#include <stdio.h>

int main() {
    FILE *file;
    int num = 12345;

    file = fopen("example.bin", "wb");
    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    fwrite(&num, sizeof(int), 1, file);
    fclose(file);

    return 0;
}

格式化文件输入输出

fscanffprintf 函数用于格式化文件输入输出,其基本语法与 scanfprintf 类似,但多了一个文件指针参数:

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

示例代码:

#include <stdio.h>

int main() {
    FILE *file;
    int num;

    file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    fscanf(file, "%d", &num);
    printf("Read number: %d\n", num);
    fclose(file);

    return 0;
}
字符串文件操作

fgetsfputs 函数用于字符串文件操作,其基本语法如下:

char *fgets(char *str, int n, FILE *stream);
int fputs(const char *str, FILE *stream);

示例代码:

#include <stdio.h>

int main() {
    FILE *file;
    char str[100];

    file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    fgets(str, 100, file);
    printf("Read string: %s", str);
    fclose(file);

    return 0;
}

3. 格式化输入输出函数

除了前面提到的 printfscanf<stdio.h> 库还提供了一组函数,用于格式化输入和输出。这些函数包括:

  • sprintf:将格式化输出写入字符串
  • sscanf:从字符串读取格式化输入
  • snprintf:将格式化输出写入字符串,限定最大长度
sprintf 函数

sprintf 函数用于将格式化输出写入字符串,其基本语法如下:

int sprintf(char *str, const char *format, ...);

示例代码:

#include <stdio.h>

int main() {
    char buffer[100];
    int num = 12345;

    sprintf(buffer, "Number: %d", num);
    printf("%s\n", buffer);

    return 0;
}

sscanf 函数

sscanf 函数用于从字符串读取格式化输入,其基本语法如下:

int sscanf(const char *str, const char *format, ...);

示例代码:

#include <stdio.h>

int main() {
    char buffer[] = "12345";
    int num;

    sscanf(buffer, "%d", &num);
    printf("Read number: %d\n", num);

    return 0;
}

snprintf 函数

snprintf 函数与 sprintf 类似,但它允许指定写入字符串的最大长度,以防止缓冲区溢出。其基本语法如下:

int snprintf(char *str, size_t size, const char *format, ...);

示例代码:

#include <stdio.h>

int main() {
    char buffer[10];
    int num = 12345;

    snprintf(buffer, sizeof(buffer), "Number: %d", num);
    printf("%s\n", buffer);

    return 0;
}

4. 字符和字符串操作函数

<stdio.h> 库还提供了一些用于字符和字符串操作的函数,如:

  • fgetc:从文件读取一个字符
  • fputc:向文件写入一个字符
  • ungetc:将字符退回到输入流
  • gets_s:安全读取字符串(C11标准引入)
fgetcfputc 函数

fgetc 函数用于从文件读取一个字符,其基本语法如下:

int fgetc(FILE *stream);

fputc 函数用于向文件写入一个字符,其基本语法如下:

int fputc(int ch, FILE *stream);

示例代码:

#include <stdio.h>

int main() {
    FILE *file;
    char ch;

    file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    while ((ch = fgetc(file)) != EOF) {
        putchar(ch);
    }
    fclose(file);

    return 0;
}

ungetc 函数

ungetc 函数用于将一个字符退回到输入流,其基本语法如下:

int ungetc(int ch, FILE *stream);

示例代码:

#include <stdio.h>

int main() {
    FILE *file;
    char ch;

    file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    ch = fgetc(file);
    printf("Read character: %c\n", ch);
    ungetc(ch, file);
    ch = fgetc(file);
    printf("Read character again: %c\n", ch);
    fclose(file);

    return 0;
}

gets_s 函数

gets_s 函数是C11标准中引入的安全字符串读取函数,用于防止缓冲区溢出。其基本语法如下:

char *gets_s(char *str, rsize_t n);

示例代码:

#include <stdio.h>

int main() {
    char str[100];

    printf("Enter a string: ");
    gets_s(str, sizeof(str));
    printf("You entered: %s\n", str);

    return 0;
}

5. 错误处理函数

<stdio.h> 库提供了一些用于错误处理的函数和宏,包括:

  • perror:打印错误信息
  • clearerr:清除文件流的错误标志
  • feof:检查文件流是否到达文件末尾
  • ferror:检查文件流是否发生错误
perror 函数

perror 函数用于打印错误信息,其基本语法如下:

void perror(const char *str);

示例代码:

#include <stdio.h>

int main() {
    FILE *file;

    file = fopen("nonexistent.txt", "r");
    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }

    fclose(file);
    return 0;
}

clearerr 函数

clearerr 函数用于清除文件流的错误标志,其基本语法如下:

void clearerr(FILE *stream);

feofferror 函数

feof 函数用于检查文件流是否到达文件末尾,其基本语法如下:

int feof(FILE *stream);

ferror 函数用于检查文件流是否发生错误,其基本语法如下:

int ferror(FILE *stream);

示例代码:

#include <stdio.h>

int main() {
    FILE *file;
    char ch;

    file = fopen("example.txt", "r");
    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }

    while ((ch = fgetc(file)) != EOF) {
        putchar(ch);
    }

    if (feof(file)) {
        printf("\nEnd of file reached.\n");
    } else if (ferror(file)) {
        printf("\nAn error occurred.\n");
    }

    fclose(file);
    return 0;
}
结论

<stdio.h> 库是C标准库中最基础和最重要的部分之一,提供了一组强大的函数用于处理输入输出操作。从标准输入输出函数到文件操作函数,从格式化输入输出函数到字符和字符串操作函数,再到错误处理函数,<stdio.h> 库涵盖了C语言程序设计中广泛的应用场景。通过深入理解和掌握这些函数,程序员可以编写出高效、健壮的C语言程序。希望本文对读者深入了解 <stdio.h> 库有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新华

感谢打赏,我会继续努力原创。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值