当前位置: 首页 > 编程日记 > 正文

不要小看字符串

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

字符串:

在标准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

相关文章:

零基础学习Python需要注意的几个点,Python培训机构排名

俗话说的好万事开头难&#xff0c;不管你做任何事情&#xff0c;开头的确很较难的&#xff0c;学Python编程也是如此&#xff0c;因此刚开始学Python编程的同学们&#xff0c;就要多借鉴过来人的经验&#xff0c;少走弯路&#xff0c;本文小编就为大家分享几个Python编程小白初…

PAT(甲级)2018年冬季考试 7-4 Heap Paths(非递归与递归解法)

非递归解法 1. 前置知识&#xff1a;完全二叉树的属性 1.1 从1开始存储&#xff0c;子节点的下标除以二得到的是父节点的下标 1.2 数组的存放顺序刚好是层序遍历顺序 1.3 从1开始存储&#xff0c;节点的下标i和结点总数n如果满足 i*2>n说明该结点是叶子结点 2. 思路&am…

Request Connection: Remote Server @ 192.229.145.200:80

录制Loadrunner脚本时&#xff0c;提示&#xff1a;Request Connection: Remote Server 192.229.145.200:80 NOT INTERCEPTED!(REASON: User requested to IGNORE connection)&#xff1b;解决方法&#xff1a;1. 打开IE里的Internet选项&#xff0c;单击连接选项卡。单击最…

抽象工厂与工厂模式例子

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

《疯狂Java讲义》学习笔记(十)异常处理

2019独角兽企业重金招聘Python工程师标准>>> 0、Java的异常体系 1、异常概述 异常机制已经成为判断一门编程语言是否成熟的标准&#xff0c;目前主流的编程语言都提供了成熟的异常机制&#xff0c;增加了异常处理机制后的程序有更好的容错性&#xff0c;更加健壮 Ja…

PAT(甲级)2018年冬季考试 7-1 Google Recruitment

1. 本题是 substrsscanf的绝佳实践。 2. 判断素数使用i*i<n与i<(int)sqrt(0.1*x)的区别是前者可能再n接近10的9次方时溢出&#xff0c;但本题不会。 3. 尽管把字符串转变成了整数&#xff0c;但输出时仍旧输出字符串&#xff0c;如果选择打印整数&#xff0c;会遇到%0K…

MySQL 的“root”用户修改密码

MySQL 的“root”用户默认状态是没有密码的&#xff0c;所以在 PHP 中您可以使用 mysql_connect("localhost","root","") 来连接 MySQL 服务器&#xff1b;如果您想为 MySQL 中的“root”用户设置密码&#xff0c;请在控制台中使用“mysqladmin”…

游戏AI之初步介绍(0)

目录 游戏AI是什么&#xff1f;游戏AI和理论AI智能的假象&#xff08;更新&#xff09;游戏AI和机器学习介绍一些游戏AI4X游戏AI《求生之路》系列角色扮演/沙盒游戏中的NPC游戏AI 需要学些什么&#xff1f;自治智能体群体智能感知状态机&#xff08;重要&#xff09;行为树&…

Google Adsense实用防踢技巧总结

我们都知道&#xff0c;对个人草根站长来说&#xff0c;Google AdSense是网站收入的主要来源之一&#xff0c;我在这里介绍一些常用的技巧。 希望通过这些技巧能够增加大家的Google AdSense收入&#xff0c;并防止自己的帐号被删除。大家喜欢的话就顶下吧&#xff01; 广告的位…

PAT(甲级)2018年冬季考试 7-3 Vertex Coloring

1. 起先我的思路是&#xff0c;对于每一种方案&#xff0c;把相同颜色的下标放到一个集合&#xff0c;对于每一个集合判断里面的元素互相之间是否有着邻接关系。有一个用例超时&#xff0c;20/25。 2. 转变思路&#xff0c;对于每一种方案&#xff0c;遍历邻接关系&#xff0c…

蚂蚁金服×西安银行 | 西安银行手机银行App的智能升级之路

小蚂蚁说&#xff1a;当前&#xff0c;数字化信号已经逐渐深入到社会的每个角落&#xff0c;影响着用户的心智和行为&#xff0c;来到数字化时代门口的银行&#xff0c;需要注意到数字化信号。西安银行通过引入蚂蚁金服移动开发平台mPaaS&#xff0c;对手机银行进行架构升级&am…

(四十七)Quartz2D引擎初步

Quartz2D是跨平台的&#xff0c;同时支持iOS与Mac。 支持圆型裁剪&#xff0c;可以实现圆形头像等功能&#xff0c;也支持手势解锁、折线图等的制作。 对于复杂的UI界面&#xff0c;还可以通过Quartz2D将控件内部的结构画出来&#xff0c;可用于自定义控件。 实际上iOS大部分控…

PAT(甲级)2018年冬季考试 7-2 Decode Registration Card of PAT

目录 体会 代码(非满分) 改进 AC代码 体会 这题主要是考察对STL中string,map,vector的应用以及自定义sort()应用。 类型1和2的处理很容易。 类型3要求对于指定date&#xff0c;按照每个考场进行分类&#xff0c;记录不同考场的人数&#xff0c;按照人数非升序&#xff…

DOS、Mac 和 Unix 文件格式+ UltraEdit使用

文件格式 区分DOS、Mac 和 Unix分别对应三种系统从文件编码的方式来看&#xff0c;文件可分为ASCII码文件和二进制码文件两种文件模式 区分ASCII模式和Binary模式 通常由系统决定&#xff0c;大多数Linux/UNIX系统只有两种模式&#xff1a;文本模式和二进制模式。文本传输器使用…

灰度图像--图像分割 Scharr算子

学习DIP第46天 转载请标明本文出处&#xff1a;http://blog.csdn.net/tonyshengtan &#xff0c;出于尊重文章作者的劳动&#xff0c;转载请标明出处&#xff01;文章代码已托管&#xff0c;欢迎共同开发&#xff1a; https://github.com/Tony-Tan/DIPpro 更多图像处理机器学习…

FileUpload生成图片水印,文字水印(转载)

/** <summary>/// 生成缩略图/// </summary>/// <param name"originalImagePath">源图路径&#xff08;物理路径&#xff09;</param>/// <param name"thumbnailPath">缩略图路径&#xff08;物理路径&#xff09;</para…

1151 LCA in a Binary Tree (含求LCA的通法)

目录 解法一思路 结果 解法一改进 解法一改进结果 ​解法二思路 解法一代码 解法一改进代码 解法二代码(AC) 解法一思路 1. 根据先序和中序建树 2. 对树进行深度优先遍历&#xff0c;找到每一个结点的父节点(注意&#xff1a;由于值的范围是int&#xff0c;直接用可…

cf 414B Mashmokh and ACM 动态规划

题目链接&#xff1a;http://codeforces.com/problemset/problem/414/B dp[i][j]表示长度为i、最后一个数字为j的合法序列总数 dp[1][1...2000]都是1 后面用dp[i-1][j] 去更新 dp[i][j*t] (1 < j*t < 2000) 即用因子去更新它的倍数 表面上看是2000^3的复杂度会爆 其实不用…

解决:angularjs radio默认选中失效问题

添加ng-model后checked"checked"失效&#xff0c;可见angularjs也不好&#xff0c;会失效html标准属性解决&#xff1a;添加ng-checked"1"<input type"radio" ng-model"sel_course" value"1" ng-checked"1" /…

在ireport报错 报 jdk5找不到的解决办法

在ireport安装目录下&#xff0c; etc目录下有ireport.conf&#xff0c; 其中有jkdhome设置&#xff0c; 把前面的#&#xff08;注释&#xff09;去掉&#xff0c; 换成自己的jdk目录就行 双引号不要去掉 jdk地址放在双引号之间 比如 改成 jdkhome"G:/ACD/jdk1.5.0&quo…

如何通过中序和层序序列建立二叉树

有这样一棵二叉树 根据节点个数 9 层序遍历结果 15 23 8 16 2 32 28 7 11 中序遍历结果 16 23 7 32 11 2 28 15 8 预期先序输出 15 23 16 2 32 7 11 28 8 运行结果 这个过程和建立二叉查找树(BST)的过程是非常相像的&#xff0c;将laSq[laIndex]插入到根为root的子树中&a…

BZOJ 3573 米特运输

Description 米特是D星球上一种非常神秘的物质&#xff0c;蕴含着巨大的能量。在以米特为主要能源的D星上&#xff0c;这种米特能源的运输和储存一直是一个大问题。 D星上有N个城市&#xff0c;我们将其顺序编号为1到N&#xff0c;1号城市为首都。这N个城市由N-1条单向高速通…

[学习笔记]最小割之最小点权覆盖最大点权独立集

最小点权覆盖 给出一个二分图&#xff0c;每个点有一个非负点权要求选出一些点构成一个覆盖&#xff0c;问点权最小是多少 建模&#xff1a; S到左部点&#xff0c;容量为点权 右部点到T&#xff0c;容量为点权 左部点到右部点的边&#xff0c;容量inf 求最小割即可。 证明&…

10分钟学会Google Map API

http://space.itpub.net/14734354/viewspace-374828 前几天玩了玩Google的Map API&#xff0c;感觉还不错&#xff0c;很简单。但凡有过任何编程经验的同学&#xff0c;看完以下的教程&#xff0c;都可以在10分钟内掌握它的主要功能。另外我还做了个简单的小例子&#xff0c;有…

1143 Lowest Common Ancestor(建树与不建两种思路)

目录 解法一 解法二 解法一 这题可以不建树&#xff0c;直接利用BST的性质&#xff1a;左子树<根节点<右子树&#xff0c;对先序序列进行遍历&#xff0c;如果有某个元素大于等于u,v中较小的且小于等于u,v中较大的&#xff0c;则可能是根节点。 这题数据弱&#xff0…

UIScrollView

UIScrollView&#xff08;包括它的子类 UITableView 和 UICollectionView&#xff09;是 iOS 开发中最常用也是最有意思的 UI 组件&#xff0c;大部分 App 的核心界面都是基于三者之一或三者的组合实现。UIScrollView 是 UIKit 中为数不多能响应滑动手势的 view&#xff0c;相比…

MySQL练习题:常用函数

1. 以首字母大写&#xff0c;其他字母小写的方式显示所有员工的姓名2. 将员工的职位用小写字母显示3. 显示员工姓名超过5个字符的员工名4. 用#来填充员工职位job的结尾处&#xff0c;按10个字符长度输出。5. 去除字符串 hello world 两边的空格&#xff0c;并将单词间的空格改…

我的WINCE4.2历程(10)

2010-04-02 今天的主要工作&#xff1a; 1&#xff09;RTC4513驱动调试&#xff0c;又做了一些尝试&#xff08;检查GPIO口的第二功能设置是否正常&#xff09;&#xff0c;结果还是不正常&#xff0c;FAINT。 2&#xff09;回顾了截止到目前取得的进展&#xff1a; a&#xff…

1069 The Black Hole of Numbers

注意两点&#xff1a; 1. 不足4位要补足&#xff0c;不仅仅是一开始要考虑&#xff0c;每次得到一个差值&#xff0c;都要考虑 2. 到0也会停下&#xff0c;不仅仅是一开始可能发生&#xff0c;也可能是过程中的某一个差值 另&#xff1a; vector<int> 是可以作为函数…

详解Asp.net MVC DropDownLists

来自网络&#xff1a; Asp.net MVC中的DropDownLists貌似会让一开始从Asp.net Forms转过来的程序员造成不少迷惑.这篇文章讲述了为了使用DropDownLists,你需要在Asp.Net MVC中知道的方方面面. DropDownList,ComboBox,无论你喜欢怎么称呼这些&#xff0c;他们毫无例外的会被生成…