Skip to content

1. 字符串

1.1 字符串数组的初始化

  • 注意
    • 对一个字符串数组,如果不做初始化赋值,必须指定数组长度。
    • 字符串数组的最后一个字符位置要留给字符串的结束标识 '\0'
  • 示例
    c
    char ch[10]; // 最多存放由 9 个字符构成的字符串,最后一个位置留给 '\0'

1.2 字符串的输入

  • 使用 scanf 函数
    • scanf 函数在读取字符串时,会以空格作为字符串的结束符。
    • 示例:
      c
      char str[10];
      scanf("%s", str); // 输入 "Hello World" 时,str 只会存储 "Hello"
  • 使用 fgets 函数
    • fgets 函数可以读取包含空格的字符串,并且可以指定读取的最大字符数。
    • 语法:
      c
      char *fgets(char *s, int size, FILE *stream);
    • 参数:
      • s:存储字符串的数组名称。
      • size:数组里存储区的个数。
      • stream:输入流,通常用 stdin 表示键盘。
    • 示例:
      c
      #include <stdio.h>
      
      int main() {
          char str[100];
          printf("请输入一个字符串: ");
          fgets(str, 100, stdin);
          printf("你输入的字符串是: %s", str);
          return 0;
      }

1.3 字符串的处理函数

1.3.1 strlen 函数
  • 功能
    • 计算指定字符串的长度,不包含字符串结束符 '\0'
  • 语法
    c
    size_t strlen(const char *s);
  • 参数
    • s:字符串的首地址。
  • 返回值
    • 字符串 s 的长度,size_tunsigned int 类型。
  • 示例
    c
    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char str[] = "Hello, World!";
        size_t len = strlen(str);
        printf("字符串长度: %zu\n", len); // 输出 13
        return 0;
    }
1.3.2 atoiatof 函数
  • atoi 函数

    • 将字符串转换为整数。
    • 语法:
      c
      int atoi(const char *str);
    • 参数:
      • str:需要转换的字符串。
    • 返回值:
      • 转换后的整数值。
    • 示例:
      c
      char str1[] = "-10";
      int num1 = atoi(str1);
      printf("num1 = %d\n", num1); // 输出 -10
      
      char str2[] = "-10a";
      int num2 = atoi(str2);
      printf("num2 = %d\n", num2); // 输出 -10
      
      char str3[] = "a-10";
      int num3 = atoi(str3);
      printf("num3 = %d\n", num3); // 输出 0
  • atof 函数

    • 将字符串转换为浮点数。
    • 语法:
      c
      double atof(const char *str);
    • 参数:
      • str:需要转换的字符串。
    • 返回值:
      • 转换后的浮点数值。
    • 示例:
      c
      char str[] = "0.123";
      double num = atof(str);
      printf("num = %lf\n", num); // 输出 0.123

1.4 作业:编写一个函数 char_contains

  • 需求
    • 编写一个函数 char_contains(char str[], char key),如果字符串 str 中包含字符 key 则返回数值 1,否则返回数值 0。
  • 实现
    c
    #include <stdio.h>
    #include <stdbool.h>
    
    int char_contains(char str[], char key) {
        for (int i = 0; str[i] != '\0'; i++) {
            if (str[i] == key) {
                return 1;
            }
        }
        return 0;
    }
    
    int main() {
        char str[] = "Hello, World!";
        char key = 'o';
        if (char_contains(str, key)) {
            printf("字符串中包含字符 '%c'\n", key);
        } else {
            printf("字符串中不包含字符 '%c'\n", key);
        }
        return 0;
    }

2. 指针基础

2.1 指针概念

  • 内存单元
    • 在计算机中,所有数据都存储在内存单元中,每个内存单元都有一个对应的地址。
    • 通过这个地址可以找到对应单元中存储的数据。
  • 指针
    • 指针是一个变量,它存储的是另一个变量的地址。
    • 通过指针可以访问和操作该地址所指向的变量。

2.2 指针的声明和初始化

  • 声明
    • 语法:
      c
      数据类型 *指针名;
    • 示例:
      c
      int *p; // 声明一个指向整数的指针
      char *pc; // 声明一个指向字符的指针
  • 初始化
    • 语法:
      c
      指针名 = &变量名;
    • 示例:
      c
      int a = 10;
      int *p = &a; // 初始化指针 p,使其指向变量 a

2.3 指针的使用

  • 访问指针指向的变量
    • 语法:
      c
      *指针名
    • 示例:
      c
      int a = 10;
      int *p = &a;
      printf("a 的值: %d\n", *p); // 输出 10
      *p = 20; // 通过指针修改 a 的值
      printf("a 的值: %d\n", a); // 输出 20

2.4 指针与数组

  • 数组名即指针
    • 数组名本质上是一个指向数组第一个元素的指针。
    • 示例:
      c
      int arr[5] = {1, 2, 3, 4, 5};
      int *p = arr; // 等价于 int *p = &arr[0];
      printf("arr[0] 的值: %d\n", *p); // 输出 1
      p++; // 指针移动到下一个元素
      printf("arr[1] 的值: %d\n", *p); // 输出 2

总结

  1. 字符串
    • 字符串数组的初始化:必须指定数组长度,最后一个位置留给 '\0'
    • 字符串的输入:scanf 以空格为结束符,fgets 可以读取包含空格的字符串。
    • 字符串处理函数:strlen 计算字符串长度,atoiatof 进行字符串转换。
    • 作业:实现了 char_contains 函数,判断字符串是否包含指定字符。
  2. 指针
    • 指针概念:指针存储的是另一个变量的地址。
    • 指针的声明和初始化:数据类型 *指针名;指针名 = &变量名;
    • 指针的使用:通过 *指针名 访问和修改指针指向的变量。
    • 指针与数组:数组名是一个指向数组第一个元素的指针。

知识如风,常伴吾身