C语言字符串

C语言字符串

  在标准C中,是没有字符串变量的,但是有字符数组。而且标准C带有的标准库函数:string.h中包含了大量的字符串操作函数,当然如果必要的话,你也可以自己写代码实现这些函数的功能。以下是小编为大家搜索整理的C语言字符串,希望能给大家带来帮助!

  对于32位操作系统

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

  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: 是一个指向以‘’结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR。

  LPTSTR和LPCTSTR:中的含义就是每个字符是这样的TCHAR。

  LPWSTR与LPCWSTR:类似于LPSTR与LPCSTR,只是字符数据是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(‘’)结尾的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 类便捷性时,有些特殊化的东西无法做,于是相互之间的转换变经常被需要:

  在转换之前必须确保你的字符的范围在你的范围之内。

  irng转 char *

  传给未分配内存的指针.

  CString cstr1="ABCD";

  char * ch=Buffer(Length+1); //获取指向CString最后一个字符的'地址。

  easeBuffer;

  注意:用完ch后,不用 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 = Length + 1;

  char *pValue = new char[strLength];

  strncpy(pValue, cstr1, strLength);

  赋值:

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

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

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

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

  r *:

  char *psz = NULL;

  psz = new char[10]; //当然,以上的直接写成char *psz = new char[10];也是一样

  memset( psz, 0, 10 );

  strcpy( psz, “joise” );

  ring:

  CString cstr;

  cstr = psz; 字符指针直接赋值

  ing:

  string str;

  str = psz; 字符指针直接赋值

  str = cstr; CString变量直接赋值

  []psz;

  加运算

  string与CString差不多,可以直接与char*进行加法,但不可以相互使用+运算符

  char*没有+运算,只能使用strcat把两个指针连在一起;

  strcat( psz, cstr );//合法

  strcat( psz, str );//非法,由此可见,CString可自动转换为const char*,而string不行

  []运算

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

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

  拓展:C语言字符串快速压缩算法代码

  通过键盘输入一串小写字母(a~z)组成的字符串。

  请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。

  压缩规则:

  1、仅压缩连续重复出现的字符。比如字符串”abcbc”由于无连续重复字符,压缩后的字符串还是”abcbc”。

  2、压缩字段的格式为”字符重复的次数+字符”。例如:字符串”xxxyyyyyyz”压缩后就成为”3x6yz”。

  示例

  输入:“cccddecc” 输出:“3c2de2c”

  输入:“adef” 输出:“adef”

  输入:“pppppppp” 输出:“8p”

  主要说来就是进行字符串处理类的问题,主要涉及到:

  1.字符串的输入与输出;

  2.基本常用的C语言的字符串的函数使用;

  3.对于多重情况的考虑;

  4.将数字转换成字符串并进行拼接;

  复制代码 代码如下:

  #include

  #include

  #include

  int main

  {

  char str[100] = {'};

  char res[100] = {'};

  scanf("%s",str);

  int length = strlen(str);

  int i=0, j=0, k=0;

  int count = 0;

  do

  {

  if(i < length && str[i++] == str[j])

  count++;

  if(str[i] != str[j])

  {

  if(count <= 1)

  res[k++] = str[j];

  else

  {

  if(count > 1)

  {

  char temp[10] = {'};

  itoa(count,temp,10);

  strcpy(res+k,temp);

  k+=strlen(temp);

  res[k++] = str[j];

  }

  }

  j = i;

  count = 0;

  }

  }while(i<length);

  res[k] = ';

  printf("The result is : %sn",res);

  return 0;

  }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 1156092664@qq.com 举报,一经查实,本站将立刻删除。

在线客服
分享本页
返回顶部