第三周

C语言中的输入输出函数

C语言有很多函数能够实现各种信息的输入和输出,信息的输入主要来源是标准输入(键盘),信息的输出主要目标是标准输出(屏幕),下面介绍几种常见的输入输出函数。

printf和scanf

  1. printf用于将数据格式化输出到标准输出(通常是屏幕)

    printf函数原型如下:

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

    printf() 函数接受一个格式化字符串format和可变数量的参数,根据格式化字符串中的占位符将参数格式化为字符串并输出到标准输出(通常是控制台)。返回值为输出的字符数。

    常见的格式化占位符以及含义:

    %d:输出有符号十进制整数。
    %u:输出无符号十进制整数。
    %f:输出浮点数。
    %c:输出字符。
    %s:输出字符串。
    %x:输出无符号十六进制整数。
    %o:输出无符号八进制整数。
    %e:以指数形式输出浮点数。
    %p:输出指针的地址。
    %%:输出一个百分号。

    创建test.c文件并编辑以下代码,注释部分为运行结果:

    print用法示例
    #include <stdio.h> int main() { int num = 10; float pi = 3.14159; char ch = 'A'; char str[] = "Hello, World!"; printf("Integer: %d\n", num); //Integer: 10 printf("Float: %.2f\n", pi); //Float: 3.14 printf("Integer: %d\nFloat: %.2f\n", num, pi); printf("Character: %c\n", ch); //Character: A printf("String: %s\n", str); //String: Hello, World! return 0; }
  2. scanf用于从标准输入(通常是键盘)读取格式化的数据

    scanf原型如下:

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

    scanf() 函数接受一个格式化字符串format和对应的参数列表,根据格式化字符串中的占位符从输入流中读取数据,并将读取到的数据存储到对应的变量中。返回值为成功读取的变量的数量。

    创建test.c文件并编辑以下代码:

    scanf用法示例
    #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("Integer: %d\n", num); printf("Float: %.2f\n", pi); printf("Character: %c\n", ch); printf("String: %s\n", str); return 0; }

    使用gcc -o test test.c命令编译后使用./test运行代码,按提示信息输入相应类型的数据:

    Enter an integer: 10
    Enter a float: 10.1
    Enter a character: d
    Enter a string: string
    Integer: 10
    Float: 10.10
    Character: d
    String: string

getchar和putchar

  1. getchar用于从输入流中读取单个字符

    getchar函数原型如下:

    int getchar(void);

    getchar() 函数没有参数,它从标准输入(通常是键盘)读取一个字符,并返回读取到的字符的ASCII码值(作为整数)。

    创建test.c文件并编辑以下代码:

    #include <stdio.h>
    
    int main() {
        char ch;
        
        printf("Enter a character: ");
        ch = getchar();
        
        printf("You entered: %c\n", ch);
        
        return 0;
    }
    

    使用gcc -o test test.c命令编译后使用./test运行代码,按提示信息输入相应类型的数据:

    Enter a character: d
    You entered: d
    
    Enter a character: dd
    You entered: d
  2. putchar用于将一个字符输出到标准输出(通常是屏幕)

    putchar函数原型如下:

    int putchar(int c);

    putchar()函数接受一个整数参数c,它表示要输出的字符的ASCII码值。函数将该字符输出到标准输出,并返回输出的字符。

    创建test.c文件并编辑以下代码:

    #include <stdio.h>
    
    int main() {
        char ch = 'A';
        
        printf("Character: ");
        putchar(ch);
        putchar('\n');
        
        return 0;
    }
     

    使用gcc -o test test.c命令编译后使用./test运行代码,按提示信息输入相应类型的数据:

    Character: A
     

其他输入输出函数

  • 标准输入输出(stdio.h库):

    • printf():用于将数据格式化输出到标准输出(通常是控制台)。
    • scanf():用于从标准输入(键盘)读取格式化的数据。
    • getchar():用于从标准输入(键盘)读取单个字符。
    • puts():用于将字符串输出到标准输出(控制台)并自动换行。
    • gets():用于从标准输入(键盘)读取字符串(已被弃用,请使用 fgets())。
  • 文件输入输出(stdio.h库):

    • fopen():打开文件并返回文件指针。
    • fclose():关闭文件。
    • fprintf():将数据格式化输出到文件。
    • fscanf():从文件读取格式化的数据。
    • fgets():从文件读取一行字符串。
  • 字符输入输出(ctype.h库):

    • putc():将一个字符写入指定的文件。
    • getc():从指定的文件读取一个字符。
  • 格式化输出(stdarg.h库):

    • sprintf():将数据格式化输出到字符串。
    • printf():将数据格式化输出到字符串或标准输出。

控制语句:分支和跳转

if语句

if语句的语法格式:

if(boolean_expression)
{
   /* 如果布尔表达式为真将执行的语句 */
}

如果布尔表达式为 true,则 if 语句内的代码块将被执行。如果布尔表达式为 false,则 if 语句结束后的第一组代码(闭括号后)将被执行。
C 语言把任何非零和非空的值假定为 true,把零或 null 假定为 false。

创建test.c文件,编辑以下代码:

#include <stdio.h>

int main() {
    int num;

    printf("Enter a number: ");
    scanf("%d", &num);

    if (num > 0) {
        printf("The number is positive.\n");
    } else if (num < 0) {
        printf("The number is negative.\n");
    } else {
        printf("The number is zero.\n");
    }

    return 0;
}

可以使用各种类型的运算符来构建表达式:

  1. 关系运算符:

    int a = 5, b = 10;
    if (a == b) {
    // 执行代码块
    }
  2. 逻辑运算符:

        int x = 5, y = 10;
        if (x > 0 && y > 0) {
            // 执行代码块
    }
  3. 位运算符:

    unsigned int flags = 0b1011;
    if (flags & 0b1000) {
        // 执行代码块
    }
    

switch语句

switch语句是C语言中用于多路分支的控制语句,它根据表达式的值,选择性地执行与每个选项相关联的代码块。以下是switch语句的基本用法:

switch (expression) {
    case constant1:
        // 与 constant1 相关的代码块
        break;
    case constant2:
        // 与 constant2 相关的代码块
        break;
    // 更多的 case 分支...
    default:
        // 默认情况的代码块
        break;
}

switch语句包含以下几个部分:

  1. expression:一个表达式,其结果将与每个case分支的常量值进行比较。

  2. case分支:每个case后面跟着一个常量表达式,用于与expression进行比较。如果expression的值与某个case的常量值匹配,将执行与该case相关联的代码块。

  3. break语句:在每个case分支的代码块结束时使用break语句,以终止switch语句的执行。如果忽略了break语句,将会发生”穿透”现象,即会继续执行下一个case分支中的代码块,直到遇到break或switch语句结束。

  4. default分支:在所有的case分支都不匹配时,将执行default分支中的代码块。default是可选的,可以省略。

创建test.c文件,编辑以下代码:

#include <stdio.h>

int main() {
    int choice;

    printf("Enter a number between 1 and 3: ");
    scanf("%d", &choice);

    switch (choice) {
        case 1:
            printf("You selected option 1.\n");
            break;
        case 2:
            printf("You selected option 2.\n");
            break;
        case 3:
            printf("You selected option 3.\n");
            break;
        default:
            printf("Invalid option.\n");
            break;
    }

    return 0;
}

使用gcc -o test test.c命令编译后使用./test运行代码,按提示信息输入相应类型的数据:

Enter a number between 1 and 3: 2
You selected option 2.

Enter a number between 1 and 3: 5
Invalid option.

Enter a number between 1 and 3: 2.1
You selected option 2.

控制语句:循环

for循环

for循环是C语言中常用的一种迭代控制结构,它可以用于重复执行一段代码块,且提供了更灵活的循环控制。以下是for循环的语法:

for (initialization; condition; increment/decrement) {
    // 循环体代码块
}

for循环包含以下四个部分:

  1. initialization:在循环开始前执行的初始化表达式,用于初始化循环计数器或其他变量。

  2. condition:在每次循环迭代前进行判断的条件表达式。只有当条件为真时,循环体中的代码块才会执行。如果条件为假,循环将结束,程序将继续执行循环后的代码。

  3. increment/decrement:在每次循环迭代后执行的增量或减量操作。它用于更新循环计数器或其他变量的值,以控制循环的进程。

  4. 循环体代码块:在 for 循环的花括号内部,是需要重复执行的代码块。这些代码将按照循环条件和增量/减量操作的规则反复执行。

创建test.c文件,编辑以下代码:

#include <stdio.h>

int main() {
    int i;

    for (i = 1; i <= 5; i++) {
        printf("Count: %d\n", i);
    }

    return 0;
}

使用gcc -o test test.c命令编译后使用./test运行代码,按提示信息输入相应类型的数据:

Count: 1
Count: 2
Count: 3
Count: 4
Count: 5

需要注意的是,for循环的各个部分都是可选的。如果省略了某个部分,相应的功能将被忽略,但循环仍然可以正常工作。例如,可以省略初始化表达式或增量操作,只保留条件表达式,以及在循环体内手动控制循环变量的更新。这样的灵活性使得for循环非常适用于各种迭代场景。

while循环和do-while循环

while循环是C语言中的一种迭代控制结构,它用于重复执行一段代码块,只要给定的条件为真。以下是while循环的语法

while (condition) {
    // 循环体代码块
}

while 循环包含以下两个部分:

  1. condition:一个条件表达式,用于判断循环是否继续执行。如果条件为真,循环将继续执行循环体中的代码块;如果条件为假,循环将结束,程序将继续执行循环后的代码。

  2. 循环体代码块:在 while 循环的花括号内部,是需要重复执行的代码块。这些代码将反复执行,直到条件为假。

创建test.c文件,编辑以下代码:

#include <stdio.h>

int main() {
    int count = 0;

    while (count < 5) {
        printf("Count: %d\n", count);
        count++;
    }

    return 0;
}

在上述示例中,while循环的条件是count<5,只要count的值小于5,循环体中的代码块将被重复执行。每次循环,count的值会递增,并打印出当前的值。当count的值达到或超过5时,条件为假,循环结束。

需要注意的是,如果条件一开始就为假,循环体中的代码块将不会执行,循环将被跳过。因此,在使用while循环时,请确保循环条件能够在某个时刻变为假,以避免陷入无限循环。通常,在循环体中需要修改条件表达式或使用控制语句(如break)来终止循环。

continue语句和break语句

continue语句用于跳过当前循环迭代中剩余的代码,直接进行下一次迭代。它的作用是终止当前迭代的剩余代码,然后重新开始下一次循环迭代。continue语句通常与条件语句结合使用,用于在满足特定条件时跳过当前迭代。

创建test.c文件,编辑以下代码:

#include <stdio.h>

int main() {
    int i;

    for (i = 1; i <= 5; i++) {
        if (i == 3) {
            continue; // 当 i 等于 3 时跳过当前迭代
        }

        printf("Count: %d\n", i);
    }

    return 0;
}

使用gcc -o test test.c命令编译后使用./test运行代码,按提示信息输入相应类型的数据:

Count: 1
Count: 2
Count: 4
Count: 5

在上述示例中,当i等于3时,continue语句将跳过printf语句,直接进入下一次循环迭代。因此,输出结果中不会包含数字3

break语句用于完全终止当前的循环,不再执行循环中的任何代码,并跳出循环体继续执行循环后的代码。它通常与条件语句结合使用,用于在满足特定条件时提前结束循环。

创建test.c文件,编辑以下代码:

#include <stdio.h>

int main() {
    int i;

    for (i = 1; i <= 5; i++) {
        if (i == 3) {
            break; // 当 i 等于 3 时终止循环
        }

        printf("Count: %d\n", i);
    }

    return 0;
}

使用gcc -o test test.c命令编译后使用./test运行代码,按提示信息输入相应类型的数据:

Count: 1
Count: 2

在上述示例中,当i等于3时,break语句将完全终止循环,不再执行任何循环代码。因此,输出结果中只包含数字12,循环在此处结束。