• 字符串系列一:C风格字符串


    (1)C风格字符串

    C风格字符串就是以''结束的字符数组,字符串字面值就是C风格字符串,它以''结尾,类型为const char*。如下面的几个例子:

    1 char ca1[] = { 'C','+','+'};//没有''结束符,不是C风格字符串
    2 char ca2[] = { 'C','+','+',''};//有''结束符,是C风格字符串
    3 char ca3[] = "C++";//字符串字面值是C风格字符串,''自动添加
    4 char* cpp = "C++";//是C风格字符串 cpp可以指向不同的字符串,但是不能通过cpp修改“C++”,因为它不在栈区,存放在常量存储区,程序结束后由系统释放
    5 6 cout<<ca1<<endl;//由于没有''结束符,故而打出来的字符串后面有乱码 7 cout<<ca2<<endl;//ok

    (2)C风格字符串标准库函数

    C语言标准库提供了一系列处理C风格字符串的库函数,在C++源文件中要使用这些库函数需要包含头文件cstring,cstring头文件是string.h头文件的C++版本,string.h是C语言提供的标准库。

    这些库函数要求传入的指针是非零值,所指向的字符数组必须以''结束,具体的库函数主要有以下几种:

    库函数 功能
    strlen(s) 反复字符串s的长度,不包含''结束符
    strcmp(s1,s2) 比较字符串的大小。若s1>s2,返回正数;若s1=s2,返回0;若s1<s2,返回负数
    strcat(s1,s2) 将字符串s2连接到s1,并返回s1
    strcpy(s1,s2) 将s2复制给s1,并返回s1
    strncat(s1,s2,n) 将s2的前n个字符连接到s1,并返回s1
    strncpy(s1,s2,n) 将s2的前n个字符复制给s1,并返回s1

    C++语言提供普通的关系操作符实现标准库类型string的对象比较,这些操作符也可用于比较指向C风格字符串的指针,但效果不同,此时比较的是指针中存放的地址,而非字符数组。C风格字符串的比较须利用strcmp标准库函数。

    (3)字符串数组必须要有''结束符

    C语言提供的处理C风格字符串标准库函数要求字符串必须有''结束符,否则处理结果无法预料,比如函数strlen,它假定要处理的字符串有''结束符,从指针指向的第一个地址开始计数直到遇到''结束符,然后返回这段内存中的字符个数,如果给定的字符不含''结束符,那么结果是随机的,不可预料的。

    (4)标准库函数要求目标字符串必须有足够的大小

    对于标准库函数strcat和strcpy,第一个实参数组都应具备足够大的空间来容纳新生成的字符串,否则至少在VS2010环境下执行之后会报运行时错误。

    相比于strcat和strcpy而言,使用能够控制字符个数的strncpy和strncat更安全,但要时刻记住为''字符预留空间。

    在使用C语言提供的标准库函数处理C风格字符串时,需要留意空间是否足够,是否会发生溢出等问题。而C++标准库类型string则不存在这方面的问题,标准库负责处理内存管理问题,因此增强了安全性,也提高了效率。

    (5)strcat和strcpy函数实现

     1 char* strcat(char* dest, const char* src)
     2 {
     3     assert((dest != NULL) && (src != NULL));
     4     char* addr = dest;
     5     while(*dest)
     6     {
     7         dest++;
     8     }
     9     while((*dest++ = *src++) != '')
    10         ;
    11     return addr;
    12 }
    13 
    14 char* strcpy(char* dest, const char* src)
    15 {
    16     assert((dest != NULL) && (src != NULL));
    17     char* addr = dest;
    18     while((*dest++ = *src++) != '')
    19         ;
    20     return addr;
    21 }

    注意:dest字符串必须要有足够的内存空间来容纳新生成的字符串,否则即使得到结果程序也会报错。

  • 相关阅读:
    寒假日报day10
    寒假日报day9
    周计划06(20201026-20201101)
    周计划05(20201019-20201025)
    周总结2
    编程语言的实现模式读后感1
    软工总结
    哈夫曼编码算法
    hive表查询——排序
    假期总结4
  • 原文地址:https://www.cnblogs.com/sophia-yun/p/3158608.html
Copyright © 2020-2023  润新知