C语言中字符串的处理方式

上一篇 / 下一篇  2011-07-14 14:59:30 / 个人分类:C

“很难从字符串中找到感觉,但它们却是我们能指望的唯一交流纽带”

                              --《C语言程序设计 现代方法》


 

  写多了 Java 代码,对 String 类 很是喜爱,可惜经典的 C 语言没有。。。最近在做程序过程中,发现对C语言字符串的处理很模糊,一会儿用数组,一会儿用指针,一会儿又引入 string.h。。。于是决定总结一下C语言中字符串的处理,一则作为笔记,二则作为技术交流和大家分享。

  1. 字符串字面量(字符串常量,在C标准中称为,字符串字面量)

    如何存储字符串字面量
      从本质上而言,C语言把字符串字面量作为字符数组来处理。当C语言编译器在程序中遇到长度为n的字符串字面量时,它会为字符串字面量分配长度为n+1的内存空间,在末尾增加一个额外的字符——空字符(\0)。

    字符串字面量的操作
     
      通常情况下可以在任何C语言允许使用 char * 指针的地方使用字符串字面量。如:
    char*p;
    p
    ="abc";
    这个赋值操作不是复制 "abc" 中的字符,而仅仅是使 p 指向字符串的第一个字符。

  2. 字符串变量
      一些编程语言为声明字符串提供了特殊的 string 类型。C语言采取了不同的方式:只要保证字符串是以空字符串结尾的,任何一维的字符数组都可以用来存储字符串。如果编写自己的字符串处理函数,请千万注意要正确地处理空字符。
      假设需要变量用来存储最多80个字符的字符串。既然字符串会在末尾处需要空字符,那么要声明的变量是含有81个字符的数组。
    #defineSTR_LEN 80

    /*惯用法*/
    charstr[STR_LEN+1];
    对宏加一的这种方法是C程序员常用的方式。

    初始化字符串变量
    chardate1[8]="June 14";
    date1: | J | u |  | e |   | 1 | 4 | \0 |

    chardate2[9]="June 14";
    date2: | J | u |  | e |   | 1 | 4 | \0 | \0 |
    大体上来说
    ,这种行为与C语言处理数组初始化的方法一致。
    字符串变量的声明可以忽略它的长度。这种情况下,编译器会自动计算长度:
    chardate3[]="June 14";
    编译器为date3分配8个字符的空间。
     
    字符数组与字符指针
    一起来比较一下下面两个声明:
    chardate[]="June 14";
    它声明date是个字符数组。和这个声明相似的是下面这个声明:
    char*date="June 14";
    它声明date是个指向字符串字面量的指针。
    [注意],不能错误地认为上面两种date可以互换。两者之间有着显著的差异:
    (1) 在声明为数组时,就像任意数组元素一样,可以修改存储在date中的字符。在声明为指针时,date指向字符串字面量。
    (2) 在声明为数组时,date是数组名。在声明为指针时,date是变量,这个变量可以在程序执行期间指向其他字符串。
      
    如果需要可以修改的字符串,那么就要建立字符数组来存储字符串。这时声明指针变量是不够的。下面的声明使编译器为指针变量分配了足够的内存空间:
    char*p;
    可惜的是,它不为字符串分配空间。在使用p作为字符串之前,必须把p指向字符串数组。一种可能是把p指向已经存在的字符串变量:
    charstr[STR_LEN+1],

    TAG:

     

    评分:0

    我来说两句