Chapter 11 字符串和字符串函数(Character Strings and String Functions)

要点总结

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

  • puts()和printf()函数都属于stdio.h系列的输入输出函数。但是,与Printf()不同的是,puts()函数只显示字符串,而且自动在显示的字符串末尾加上换行符。
  • 字符串常量,指用双引号括起来的的内容。
  • 字符串常量属于静态存储类别,即只被存储一次,但可以存在于整个程序的生命期。
  • 用双引号括起来的内容被视为指向该字符串存储位置的指针。
  • 数组和指针
    • 二者都可以表示字符串的地址,但是这两种形式并不完全相同。
    • 区别:
      • 初始化数组把静态存储区的字符串拷贝到数组中,而初始化指针只把字符串的地址拷贝给指针。
      • 数组名是常量,而指针名是变量。因此只有指针可以进行递增操作。
      • 具体解释
        • 数组形式(ar[])在计算机的内存中分配一个内含29个元素的数组(每个元素对应一个字符,还加上一个末尾的空字符\0),每个元素被初始化为字符串字面量对应的字符。通常,字符串都作为可执行文件的一部分储存在数据段中。当 把程序载入内存时,也载入了程序中的字符串。字符串储存在静态存储区中。但是,程序在开始运行时才会为该数组分配内存。此时,才将字符串拷贝到数组中。 注意,此时字符串有两个副本。一个是静态内存中的字符串字面量,另一个是储存在ar1数组中的字符串。此后,编译器把数组名ar1识别为该数组首元素地址的别称。在数组形式中,ar1是地址常量不能更改ar1,如果改变了ar1,则意味着改变了数组的存储位置。可以进行ar1+1这样的操作,不能进行++ar1这样的操作。递增运算符只能用于变量名前,不能用于常量。
        • 指针形式(*pt1)也使得编译器为字符串在静态存储区预留29个元素的空间。一旦开始执行程序,它会为指针变量留出一个储存位置,并把字符串的地址储存在指针变量中。该变量最初指向该字符串的首字符,但是它的值是可以改变的。因此,可以使用递增运算符。
    • 建议 在把指针初始化字符串字面量时使用const限定符。如果不修改字符串,不要用指针指向字符串字面量。编译器可以使用内存中的一个副本来表示所有完全相同的字符串字面量。如果使用单次副本表示法,并允许修改其中的某一个字符,那将影响所有使用该字符串的代码。
    • 通过赋值方式copy字符串,实际上只是拷贝了这个字符串的地址,即让拷贝后的变量也指向原字符串。如果真的需要拷贝整个数组,可以使用strcpy()和strncpy()函数。

2. 字符串输入

  • 把字符串读入程序,首先预留出存储该字符串的空间,然后用输入函数获取该字符串。
    • 分配空间。最简单的方法是在声明时显式指明数组的大小;另一种是通过C库函数来分配内存。
  • 在读取字符串时,scan()和转换说明%s只能读取一个单词。
  • 读取整行输入,可以使用gets()。gets()函数简单易用,并在这些字符的末尾添加一个空字符使其成为一个C字符串。但是,gets()函数不能检查出字符串长度是否溢出。因为此函数只知道数组的开始,并不知道数组中有多少个元素。
  • fgets()函数通过第2个参数限制读入的字符的最大数量来解决溢出问题。如果该参数的值时n,那么fgets()将读入n-1个字符,或者读到遇到的第一个换行符为止。第3个参数指明要读入的文件。如果读入从键盘输入的数据,则以stdin作为参数,该标识符定义在stdio.h中。例如,fgets(word, stlen, stdin)
  • fputs()函数第2个参数指明它要写入的文件,如果要显示在计算机显示器上,应使用stdout作为参数。例如,fputs(word, stdout)。
  • gets_s()函数与fgets()类似,用一个参数限制读入的字符数。与fgets()的区别:gets_s()只从标准输入中读取数据,所以不需要第三个参数。如果gets_s()读到换行符,会丢弃它而不是储存它。只要输入行未超过最大字符数,gets()和gets_s()几乎一样。如果读到最大字符数还没有读到换行符,会执行一下几步。首先把目标数组中的首字符设置为空字符,读取并丢弃随后的输入直到读到换行符或者文件结尾,然后返回空指针。接着,调用依赖实现的处理函数,可能会中止或退出程序。

3. 字符串输出

  • puts()函数只需把字符串的地址作为参数传递给它。

4. 字符串函数

  • strlen()函数用于统计字符串的长度。
  • strcat()函数用于拼接字符串。接受两个字符串作为参数。该函数把第二个字符串附加在第一个字符串末尾,并把拼接后形成的新字符串作为第一个字符串,第二个字符串不变。但是无法检查第一个数组是否能容纳第二个字符串。
  • strncat()函数第三个参数指定了最大添加字符数。
  • strcmp()函数用于比较字符串。相同返回0,不同返回非0.
  • strncmp()函数比较字符串中的字符,直到发现不同的字符位置。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值