《C Prime Plus》第十一节笔记

第十一章 字符串和字符串函数


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

  • puts()函数只显示字符串,而且自动在显示的字符串末尾加上换行符
11.1.1 在程序中定义字符串
  1. 字符串字面量(字符串常量)
    • 用双引号括起来的内容称为字符串字面量(string literal),也叫字符串常量(string constant)
    • 字符串常量属于静态储存类别
  2. 字符串数组和初始化
    • 让编译器计算数组大小只能用在初始化数组时。如果创建一个稍后再填充的数组,就必须在声明时指定大小。
    • 两种初始化:
    1
    2
    
      1. 字符数组名初始化: char car[10] = "Tata";
      2. 指针数组初始化:   char * pt1 = "Something is pointing at me";  
    
  3. 数组和指针的区别
    • 字符串储存在静态储存区中
    • 初始化数组把静态存储区的【字符串】拷贝到数组中,而初始化指针只把字符串的【地址】拷贝给指针
    • 数组的元素是变量(除非数组被声明成const),但数组名不是变量。
    • 如果不修改字符串,不要用指针指向字符串字面量。
  4. 字符串数组
    • 创建字符数组:
      1
      2
      
      1. 指向字符串的字符数组
      2. char类型数组的数组
      
    • 下标访问字符串
    • 字符串数组[字符串下标][字符串字符]
    • 字符数组和char数组的区别:
      1
      2
      3
      
      1. 大小不同,类型不同。
      2. 储存方式不同,静态内存和副本的区别。
      3. 字符串数组分配内存的使用率较低。
      
    • 在选择上
      1
      2
      
      1.需求效率:使用指针数组,但是不可修改,会擦写程序内存。
      2.需求更改或输入:使用字符数组,但是效率低。
      
11.1.2 指针和字符串
  • 区分指针的值,指针指向的值:指针的值是指向的地址,指针指向的值是地址存储的内容。

11.2 字符串输入


11.2.1 分配空间
  • 在创建字符串数组时有必要分配空间,以防止擦写其他程序或内存
    1
    2
    
    1.在声明时显式指明数组大小
    2.使用C库函数来分配内存
    

11.2.2 不幸的gets()函数
  • 本是用于处理整行输入。
  • gets()函数只知道数组的开始处,并不知道其中有多少个元素。如果输入的字符串过长,可能会导致缓冲区溢出。
  • gets()函数会读取输入至换行符,并丢弃换行符,在末尾添加\0,进行存储。

11.2.3 gets()函数的代替品
  1. fgets()函数( 和fputs()函数 )
    • 三大特点:
    1
    2
    3
    
    1. 限制: fgets()函数指明了读入字符的最大数量,保存在第二个参数中,如果参数是n,那么将读取n-1个字符。
    2. 保留: 如果fget()函数读取到一个换行符,那么会将其储存而不是删除。
    3. 来源: fgets()第三个参数指明要读取的文件。如果来源于键盘,则以stdin为参数。
    
    • puts()函数会在输入的字符串末尾添加一个换行符,而fgets()不会。
    • fgets()处理多行输入:
    1
    2
    3
    
        while(fgets(words,lens,stdin)!=NULL && word[0]!='\n'){
            fputs(words,stdout);
        }
    
  2. get_s()函数
    • 基本形式:
    1
    
        get_s(字符串地址,大小);
    
    • get_s()与fgets()的区别:
    1
    2
    3
    
        1. get_s()没有第三个参数,只从标准输入中读取数据。
        2. get_s()如果读到换行符,会舍弃它。
        3. 
    
    • 关于选择:
      1. 存储区装得下输入,三者无差,但fgets()会保留\n
      2. 存储区装不下输入,fgets()可以灵活处理。

11.2.4 scanf()函数
  • scanf(),fgets()和gets()函数的区别在于如何确定字符串的末尾。
  • scanf()函数会返回一个整数值,该值等于scanf()成功读取的项数或者EOF(读到文件末尾)
  • %s可防止输入溢出。

11.3 字符串输入

  • 打印字符串的三个标准库函数:puts(),fputs()和printf();
  1. puts()函数
    • 传入地址。
    • puts()函数会在字符串末尾自动添加一个\n;
    • 该函数遇到空字符就会停止输出,所以必须保证又空字符存在。
    • gets()丢弃换行符,但puts()添加换行符
  2. fputs()函数
    • 第二个参数指明来源
    • 不会在输出的末尾添加\n
    • fgets()保留换行符,且fputs()不会添加换行符。
  3. printf()函数
    • 打印多个字符串比较简单。

11.4 自定义输入/输出函数

  • 自己写函数
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
    void put1(const char * string){
        while(*string){            //*string ='\0'相同,string指向空字符时*string的值时0
            putchar(*string++);    // ++优先级高于*
        }
    }
    
    int put2(const char * string){
        int count=0;
        while(*string){
            putchar(*string++);
            count++;
        }
        putchar('\n');
        
        return count;
    }

11.5 字符串函数

  • strlen()函数

    • 表示长度,存在于string.h
  • strcat()函数

    • 作用:拼接两个字符串
    • 示例
    1
    
        strcat(str1,str2);   // 将str2拼接到str1后面,改变str1而不改变str2
    
    • 缺点:strcat无法检测第一个数组能否容纳第二个数组,可能会造成字符溢出。
  • strncat()函数

    • 改进strcat()函数,第三个参数指定最大添加字符数,末尾自动添加空字符。
    • 示例
    1
    
        strnact(str1,str2,size);  //将str2的前size个字符拼接到str1后面。
    
  • strcmp()函数

    • 作用:比较字符串,如果相同则返回0,否则返回非零值。
    • 示例
    1
    
        strcmp(str1,str2);
    
    • 本机操作 返回的值:从不相同的字符开始,前一个字符排在ascii前则返回-1,否则返回1,相同0;
    • 书本 返回的值是前一个字符串的acsii码减后一个的,按照机器排序顺序进行比较。
    • strncmp第三个参数指定查找前几个字符。
  • strcpy()和strncpy()函数

  • sprintf()函数

    • 1
  • 其他字符函数

发表了74篇文章 · 总计107.96k字
本博客已稳定运行
使用 Hugo 构建
主题 StackJimmy 设计