zoukankan      html  css  js  c++  java
  • C字符串

    C字符串

      C中的字符串是以空字符('')结尾的一个char数组,基本的实现字符串的方法有:字符串常量,字符串数组,char数组,char指针。字符串使用广泛,如与用户交互等处理自然语言的情况。C为其提供的许多函数主要包含在string.h(各种处理函数)和stdio.h(面向字符串的输入输出函数)。

    一、字符串的实现

    1.字符串常量

      字符串常量(又称字符串文字),是指位于一对双引号中的任何字符,编译器会自动在其结尾添加''作为结束标志。字符串常量属于静态存储类,即使多次调用这个常量它在内存中也只存储一份(当然,再用字符串常量初始化char数组时它被复制了,这时副本已经不是字符串常量了)。字符串常量做参数时形参通常声明为const char *。

    2.char数组与char指针

    (1)在使用char数组时需要有足够大的空间来存储字符串。在对char数组进行初始化的情况下可以不指定长度而由编译器决定(最小长度,字符数加一个'')。

    (2)char数组初始化有两种方式,可以用一个字符串常量,也可以像数值数组一样用花括号包含初始化表列,未被初始化的元素被自动置为''【char [] = “example”;】。

    (3)在使用初始化表列且未指定数组长度时,一定要在结尾加上'',否则这只是一个字符数组而非字符串。和其它数组一样char数组是一个指向一段连续空间首地址的指针常量。

    (4)char指针指向一个字符串的首地址(通常是字符串常量也可以是一个char数组)。对char数组赋值必须逐个元素赋值,对char指针赋值只需要复制地址即可。

     

    //例
    
    char *ch;//声明一个指针ch
    
    ch = (char *)malloc(sizeof(char));//ch指向一个char类型的数组

    (5)char指针可以进行加减,自增(减),取值运算也可以像数组一样进行变址运算(s[])。而char数组不允许修改。数组与指针在内存模型上有更多区别。比如:

     

    char arr[M];
    
     char *ptr = (char *)malloc(sizeof(char));
    
     printf("%d %d
    ", sizeof(arr),sizeof(ptr) );

    (6)char指针指向的字符串在内存中只存储了一份,一旦修改所有引用处均被修改,而且char指针难以指定空间大小(必须用malloc)。

    char指针初始化后,尽量不要修改其内容(包括用来接受输入),或者使用const来保护其内容。因为char指针指向空间有限,一般只作为字符串常量使用。

    3.字符串数组

      (1)批量处理字符串可以使用字符串数组,可以使用二维char数组(char s[][])或指针数组(char*s[])。其异同与数值型二维数组和指针数组相同。

      (2)由于二维数组的第二维长度必须保证大于最长的字符串,指针数组每个字符串只需要最小长度,所以指针数组的存储密度较高。同样由于初始化困难,指针数组通常作为常量使用。

    二、字符串操作函数

    字符串的输入输出请参见I/O一文。除特殊说明外,下列函数均需包含string.h。

    1.字符串长度:

      size_t strlen(const char*); 

      返回字符串第一个''前的字符数(不包含''),即字符串的有效长度。

    2.字符串复制(string copy):

      char* strcpy(char*dest,const char*sco); 

       将参数2(source)中字符串复制到参数1(destination)中,返回指向参数1的指针。需要程序员保证串1足够大。

      char*strncpy(char*dest,const char sco,size_t n); 

        将前n个字符进行复制。

        void*memcpy(void*dest,const void*sco,size_t size); 

        将sro指向的内存内容复制到dest,由size参数指定长度。需包含string.h或memory.h。memcpy可以复制任何内容,strcpy只能复制字符串。

    3.字符串比较(string compare):

       int strcmp(const char*,const char*); 

       比较字符串相同返回0,不同返回第一个不同字符ASCII码之差。大小写不敏感,常与逻辑非(!)结合表示字符串相同。

       int stricmp(const char*,const char*); 

      以大小写不敏感的方式复制字符串。

    4.字符串连接(string catch):

      char*strcat(char*dest,const char*src); 

       将src字符串接在dest后面(自动移动''),返回dest指针。需程序员保证dest足够长。

      char*strncat(char*dest,char*sco,size_t n); 

      将sco的前n个字符连接在dest上。

    5.查找子串(string string):

       char*strstr(const char*text,const char*model); 

       在正文(test)中查找模式子串(model),返回从指向第一个匹配点的char指针。可以使用

       strlen(test)-strlen(strstr(test,model))来求得匹配点的下标。

    6.查找字符(string character):

       char* strchr(char*test,char c); 

       在test中查找字符c,返回指向c的指针,可以利用长度相减确定下标。也可以用来查找字符串中是否有给定字符集中的字符(或给定字符集中没有的字符)。

        

    复制代码
    for( int i = 0; i < strlen(test); i++) {
    
      if(strchr(lib,test[i])) {
    
         //…
    
      }
    
    }
    复制代码

    在字符集(lib)中查找test中的每一个字符,判断test中的哪一个(或全部)字符是否在(或不在)字符集内。在test中查找lib中的每一个字符通过返回值判断test中有lib里的哪个字符。

    7.向字符串格式化输出(string print format):

       int sprintf(char*buf,const char*format,…); 

      用法类似printf,但是向字符串buf输出并返回buf的长度(同strlen),多次向同一字符串输出将覆盖原有内容。需包含stdio.h。

      可以用来将数字逐位打印到数组中,对每一位进行处理。但要注意字符串中的是数字字符而不是数字,不要忘记-'0'【9=”9”-”0”】。

    8.从字符串格式化输入(string scan format):

       int sscanf(char*buf,const char*format,…); 

         用法类似scanf,但是从buf中读取。成功返回参数数目,失败返回-1。需包含stdio.h

       可以用来将字符串转换成数值或者进行匹配输入("x=%lf",从中读取数值)。

           sprintf与sscanf函数常用来实现字符串与其它数据类型的转换。

  • 相关阅读:
    几种常见的Map的区别
    BlockingQueue详解
    Android开发过程中内存泄露检测
    Android studio 技巧设置(持续更新中)
    Android Support兼容包详解
    单例模式的饿汉式为什么需要双重锁定
    View分析
    Activity的启动流程分析
    LeetCode第十四题-字符串数组中最长的共同前缀
    LeetCode第十三题-将罗马数字转化为数字
  • 原文地址:https://www.cnblogs.com/yechanglv/p/6947262.html
Copyright © 2011-2022 走看看