第十一章 - DDL-Killer/The-road-of-Linxu-Group2024 GitHub Wiki

表示字符串和字符串I/O

  • 字符串是以空字符(\0)结尾的char类型的数组

在程序中定义字符串

  1. 字符串字面量(字符串常量)
    • 用双引号括起来的内容称为字符串字面量,也叫作字符串常量
    • 双引号中的字符和编译器自动加入末尾的\0字符,都作为字符串储存在内存中
    • 在字符串内部使用双引号,必须在双引号前面加上一个""
    • 字符串常量属于静态存储类别
  2. 字符串数组和初始化
    • 定义字符串数组时,必须让编译器知道需要多少空间
    • 在指定数组大小时,要确保数组的元素个数至少比字符串多1
    • 所有未被初始化的元素都被自动初始化为0(\0)
  3. 数组和指针
    • 字符串储存在静态存储区,程序在开始运行时才会为该数组分配内存,此时有两个副本,一个是静态内存中的字符串常量,另一个是储存在数组中的字符串
    • 编译器把数组名识别为该数组首元素地址的别名
    • 数组名是地址常量,改变了数组名,就意味着改变了数组的存储位置
    • 指针形式使编译器为字符串在静态存储区预留元素空间,并把字符串的地址储存在指针变量里,该变量最初指向该字符串的首地址
  4. 数组和指针的区别
    • 数组的元素是变量,数组名不是变量
    • 如果不修改字符串,不要用指针指向字符串字面量
  5. 字符串数组
    • 如果要用数组表示一系列待显示的字符串,请使用指针数组
    • 如果要改变字符串或为字符串输入预留空间,不要使用指向字符串字面量的指针

指针和字符串

字符串输入

分配空间

为字符串分配内存后,便可读入字符串

不幸的gets函数

  • gets()函数读取整行输入,直至遇见换行符,丢弃换行符,储存其余字符,并在这些字符末尾添加一个空字符使其称为C字符串
  • 如果输入的字符串过长,会导致缓冲区溢出
  1. fget()函数
    • fget()函数的第二个参数限制读入的字符数来解决溢出的问题,通过指明读入字符的最大数量,规定读到n-1或者第一个换行符停止
    • 如果fget()读到一个换行符,它会储存在字符串中
    • fget()函数的第三个参数指明要读入的文件
    • fget()把换行符放在字符串的末尾
    • 系统使用缓冲的I/O,这意味着用户在按下return之前,输入都被存储在临时存储区
  • 空字符和空指针 空字符是整数类型,占一个字节
    空指针是指针类型,占四个字节
  1. gets_s()函数
    • gets_s()只从标准输入中读取数据
    • gets_s()读到换行符,会丢弃而不是储存
    • 如果读到最大字符数没有读到换行符:
      1. 把目标数组中的首字符设置为空字符
      2. 读取并丢弃随后输入直至读到换行符或文件结尾
      3. 返回空指针
      4. 调用处理函数,可能会终止或退出程序

scanf()函数

  • scanf()函数返回一个整数值,该值等于scanf()成功读取的项数或EOF
  • 使用%s可以防止数据溢出

字符串输出

puts()函数

  • 直接把字符串的地址作为参数传递
  • puts()在显示字符串末尾时会自动添加一个换行符
  • puts()遇到空字符时就停止输出

fputs()函数

  • 第二个参数指明要写入数据的文件
  • 不会添加换行符

printf()函数

  • 可以格式化不同的数据类型

自定义输入/输出函数

  • 在getchar()和putchar()基础上自己修改

字符串函数

string.h

strlen()函数

strcat()函数

  • 接受两个字符串作为参数,把第二个字符串的备份附加在第一个字符串的末尾,并把拼接后的新字符串作为第一个字符串,第二个字符串不变
  • 第一个字符串末尾的

strncat()函数

  • 第三个的参数指定最大添加的字符数

strcmp()函数

  • 比较的是字符串的内容,而不是地址
  • 返回值是ASCII编码的差值

strncmp()函数

  • 可以比较到第三个参数指定的位置

strcpy()函数和strncpy()函数

  • 拷贝整个字符串,使用strcpy()函数
  • strcpy()的第二个参数指向的字符串被拷贝至第一个参数指向的数组
  • strcpy()接受两个字符串指针作为参数,可以把指向源字符串的第二个指针声明为指针、数组名或字符串常量
  1. strcpy()的其他属性
    • 返回类型是char *
    • 返回的是第一个参数的值——一个字符的地址
    • 第一个参数不必指向数组的开始
  2. strncpy()
    • 第三个参数指明可以拷贝的最大字符数
    • 如果没拷贝完,不会补充空字符

sprintf()函数

  • 第一个参数是要写入的目标字符串的地址,其余参数与printf()一样

字符串排序

排序指针而非字符串

选择排序算法

  • 把每个元素和首元素比较

ctype.h字符函数和字符串

命令行参数

把字符串转换为数字

atoi()函数,接受一个字符串作为参数,返回相应的整数值