不要小看字符串

news/2024/7/3 1:29:56

字符串非常非常常见又重要,而且还有那么多名堂在里面

字符串:

在标准C中,是没有字符串变量的,但是有字符数组。而且标准C带有的标准库函数:string.h中包含了大量的字符串操作函数,当然如果必要的话,你也可以自己写代码实现这些函数的功能。我认为即便C语言再简单,即便这些知识看起来是多么枯燥和简单,依然有必要回顾并牢记它们:

对于32位操作系统

int (2字节)  short (1字节) long(4字节)

UINT类型是unsigned int派生出来的,int是带符号的,表示范围是:-2147483648 到2147483648,uint是不带符号整形,表示范围是0到4294967295,即第一个数字不表示符号.

unsigned  char 从0到256之间
char   从-128到127之间
byte  字节就是无符号的字符
unicode:两字节的字符

由此可见:byte=nusigned char, short=char

 

 

char* :是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。
TCHAR: 在采用Unicode方式编译时是wchar_t,在普通时编译成char. 如果定义_UNICODE,声明如 typedef wchar_t TCHAR; 如果没有定义_UNICODE,则声明如:typedef char TCHAR;
LPSTR: 是一个指向以‘\0’结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR
LPTSTRLPCTSTR:中的含义就是每个字符是这样的TCHAR

LPWSTR
LPCWSTR类似于LPSTRLPCSTR,只是字符数据是16位的wchar_t而不是char

 

LPCSTR: 增加的‘C’的含义是“CONSTANT”(常量),表明这种数据类型的实例不能被使用它的API函数改变,除此之外,它与LPSTR是等同的。
LPCTSTR:
     #ifdef _UNICODE
        typedef const wchar_t * LPCTSTR;
     #else
        typedef const char * LPCTSTR;
     #endif

 CString类, 是由微软公司集成在VC的MFC里面,包含字符串各种常见操作的类。其源码可以在MFC里面找到。
当声明一个字符串变量,首先会调用构造函数,在成功后,便可利用它的常见操作。

CString 是一个完全独立的类,动态的TCHAR数组,封装了 + 等操作符和字符串操作方法。

 

 

1、ANSI(即MBCS):为多字节字符集,它是不定长表示世界文字的编码方式。

2、Unicode:用两个字节表示一个字符的编码方式。

MBCS宏对应的字符串指针为LPSTR,Unicode对应的指针为LPWSTR。LPSTR被定义成是一个指向以NULL(‘\0’)结尾的8位ANSI字符数组指针,而LPWSTR是一个指向以NULL结尾的16位双字节字符数组指针。

为了写程序的方便,微软定义了类型LPTSTR,在MBCS下它表示LPSTR,在Unicode下它表示LPWSTR,这就可以重定义一个宏进行不同字符集的转换了。

LP STR:指向一个字符串的32位指针,每个字符占1个字节。
LPC STR:指向一个常量字符串的32位指针,每个字符占1个字节。
LP TSTR:指向一个字符串的32位指针,每个字符可能占1个字节或2个字节。
LPC TSTR:指向一个常量字符串的32位指针,每个字符可能占1个字节或2个字节。

 

强制转换为UNICODE,应该是L。字符串(literal string)前面的大写字母L,用于告诉编译器该字符串应该作为U n i c o d e字符
串来编译。当编译器将字符串置于程序的数据部分中时,它在每个字符之间分散插入零字节。


#ifdef _UNICODE
#define _T L
#else
#define _T
#endif
These data-type mappings are defined in TCHAR.H and depend on whether the constant _UNICODE or _MBCS has been defined in your program.

 

当我们在利用CString 类便捷性时,有些特殊化的东西无法做,于是相互之间的转换变经常被需要:
在转换之前必须确保你的字符的范围在你的范围之内。
1.CStirng转 char *

 
传给未分配内存的指针.
  CString cstr1="ABCD";
  char * ch=cstr1.GetBuffer(cstr1.GetLength()+1);  //获取指向CString最后一个字符的地址。
  cstr1.ReleaseBuffer();
注意:用完ch后,不用delete ch,因为这样会破坏cstr内部空间,容易造成程序崩溃.

GetBuffer :这个函数是为一个CString对象重新获取其内部字符缓冲区的指针,返回的LPTSTR为非const的,从而允许直接修改CString中的内容!如果nMinBufLength 比当前buffer大,那么就调用ReleaseBuffer函数去释放当前的Buffer,用一个被请求的大小去覆盖这个buffer.
而GetBuffer则是返回一个可以供调用者写入的内存,并且,你可以给定大小。其实它就相当于申请一块nLen大小的内存,只不过,这块内存是被引用在CString对象的内部而已,这是非常有效的一种用法,如果不直接用GetBuffer函数来申请的话,那么你必须用new操作符(或者malloc()函数)在CString的外部申请,然后再将申请的内存拷贝到CString对象中,显然这是一个非常冗余的操作,会使你函数的效率大大下降。
ReleaseBuffer函数是用来告诉CString对象,你的GetBuffer所引用的内存已经使用完毕,现在必须对它进行封口,否则CString将不会知道它现在所包含的字符串的长度,所以在使用完GetBuffer之后,必须立即调用ReleaseBuffer函数重置CString的内部属性,其实也就是头部信息。

 

值赋给已分配内存的char *
    CString cstr1 = "ASDDSD";
    int strLength = cstr1.GetLength() + 1;
    char *pValue = new char[strLength];
    strncpy(pValue, cstr1, strLength);

赋值:
char* psz = “joise”; 没有构造函数,仅可以赋值(因为它本身就是基本型)

CString cstr( psz ); 可以从基本的一些字符串变量构造而来,包括char*等

string str( cstr );  可以从几乎所有的字符串构造而来,包括CString和char*;

以上也可以看作由 char *转CStirng的办法。

 

1.char *:
char *psz = NULL;
psz = new char[10]; //当然,以上的直接写成char *psz = new char[10];也是一样
memset( psz, 0, 10 );
strcpy( psz, “joise” );
2.CString:
CString cstr;
cstr = psz;  字符指针直接赋值
3.string:
string str;
str = psz;   字符指针直接赋值
str = cstr;  CString变量直接赋值
delete []psz;

加运算

string与CString差不多,可以直接与char*进行加法,但不可以相互使用+运算符
char*没有+运算,只能使用strcat把两个指针连在一起;
strcat( psz, cstr );//合法
strcat( psz, str );//非法,由此可见,CString可自动转换为const char*,而string不行

[]运算

CString最好,当越界时会抛出断言异常;

string与char*下标越界结果未定义;

 

C语言串的基本运算
1、求串长
        int strlen(char *s);         //
求串s的长度
   
【例】printf("%d",strlen(s1));    //输出s1的串长12

2、串复制
    char *strcpy(char *to,*from)
//from串复制到to串中,并返回to开始处指针
   
【例】strcpy(s3,s1);  //s3="dir/bin/appl",s1串不变


3
、联接
    char *strcat(char *to,char *from);//
from串复制到to串的末尾,
                                      //
并返回to串开始处的指针
   
【例】strcat(s3,"/");    //s3="dir/bin/appl/"
         strcat(s3,s2);     //s3="dir/bin/appl/file.asm"

4、串比较
    int strcmp(char *s1,char *s2);//
比较s1s2的大小,
     //
s1<s2s1>s2s1=s2时,分别返回小于0、大于0和等于0的值
   
【例】result=strcmp("baker","Baker");    //result>0
            result=strcmp("12","12");       //result=0
            result=strcmp("Joe","joseph")   //result<0

5、字符定位
    char *strchr(char *s,char c);//
c在字符串s中第一次出现的位置,
                                 //
若找到,则返回该位置,否则返回NULL
   
【例】p=strchr(s2,'.');      //p指向"file"之后的位置
     if(p) strcpy(p,".cpp");     //s2="file.cpp"

  注意:
   
 ①上述操作是最基本的,其中后 4个操作还有变种形式:strncpystrncathstrnchr
   
 ②其它的串操作见C<string.h>。在不同的高级语言中,对串运算的种类及符号都不尽相同
   
 ③其余的串操作一般可由这些基本操作组合而成

    【例】求子串的操作可如下实现:
    void substr(char *sub,char *s,int pos,int len){
         //s
sub是字符数组,用sub返回串s的第pos个字符起长度为len的子串
         //
其中0<=pos<=strlen(s)-1,且数组sub至少可容纳len+1个字符。
        if (pos<0||pos>strlen(s)-1||len<0)
            Error("parameter error!");
        strncpy(sub,&s[pos],len);      //
s[pos]起复制至多len个字符到sub

转载于:https://www.cnblogs.com/clrmas/archive/2010/03/23/1692898.html


http://lihuaxi.xjx100.cn/news/281782.html

相关文章

html页面调用ico图标,如何在HTML中使用图标字体 - icon font?

日期&#xff1a;2012-8-27 来源&#xff1a;GBin1.com在线演示 本地下载主要特性使用icon font来生成图标相对于基于图片的图标来说&#xff0c;有如下的好处&#xff1a;自由的变化大小自由的修改颜色添加阴影效果IE6也可以支持支持图片图标的其它属性&#xff0c;例如&…

用产品思路建设中台,这走得通吗?| 白话中台

作者 | 王健&#xff0c;ThoughtWorks首席咨询师。 十多年国内外大型企业软件设计开发&#xff0c;团队组织转型经验。一直保持着对技术的热爱&#xff0c;热衷于技术分享。目前专注在企业平台化转型、中台战略规划&#xff0c;微服务架构与实施&#xff0c;大型遗留系统服务化…

任天堂遭史上最严重黑客攻击:完整源代码、设计文档及技术演示泄露

十三 发自 凹非寺量子位 报道 | 公众号 QbitAI任天堂的这一波泄露事件&#xff0c;可以说是相当惨烈。多少文件被泄露&#xff1f;超过2TB。涉及什么内容&#xff1f;完整源代码、设计文档&#xff0c;近乎一切用于构建Wii主机的资料&#xff0c;还包括像N64的技术演示。这次泄…

什么是云到云备份?

C2C备份越来越受欢迎&#xff0c;那么它是什么&#xff1f;如果发生最坏的情况&#xff0c;它如何帮助您的业务&#xff1f; 大多数企业都了解为其本地数据制定强大的备份策略的重要性&#xff0c;但随着越来越多的公司迁移到云&#xff0c;关于如何在云环境中备份数据的神话和…

OpenCV Python + Tesseract-OCR轻松实现中文识别

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达推荐阅读 42个pycharm使用技巧&#xff0c;瞬间从黑铁变王者Google C项目编程风格指南 (中文版) 分享转自|opencv学堂01软件版本- Python3.6.5 - OpenCV-Python 4.x - Te…

html设备监控系统模板,蓝色的远程监控设备系统后台管理界面模板

资源下载此资源下载价格为4D币&#xff0c;请先登录资源文件列表codedown123-0729-35/actions.html , 5281codedown123-0729-35/add.html , 7608codedown123-0729-35/apikey_manage.html , 4719codedown123-0729-35/batch.html , 7400codedown123-0729-35/change_password.html…

canvas-绘制矩形-读书笔记

使用<canvas>元素&#xff0c;必须先设置其width和height属性&#xff0c;指定可以绘图的区域大小。 要在画布上绘图&#xff0c;需要取得绘图上下文&#xff0c;也就是要调用getContext()方法并传入上下文的名字。在使用<canvas>元素前&#xff0c;首先要检测下ge…

抽象工厂与工厂模式例子

NativeFactory。java package com;//定义 人有杀日本人 和 杀美国人两个方法interface NativePerson{ public void killAmeria(); public void killJapan();}//中国人实现了人的接口 class NativeChinese implements NativePerson{ //中国人杀美国人 public void killAmeria() …