zoukankan      html  css  js  c++  java
  • 常用的类型转化

    在C++程序中存在着多种的数据类型的转化,在数据中常用的数据类型包括:常量int double float long;字符 CS

    tring char char[] char*等之间存在着多种转化。

    常量:int double float long 与CString之前转化

    CString>常量

    在转换中常用在<stdlib.h>文件中的函数atoi、atol、atof。

    CString str="123";
    int i=atoi(str);
    long j=atol(str);
    float k=atof(str);
    常>CString

    转化中常用CString中的format函数

    int i=12;
    long j=123;
    float k=123.34;
    CString str;
    str.format("%d",i);
    str.format("%ld",j;
    str.format("%f",K);
    //在format中通过str.format("%2f",k)说明保留小数点后的两位数
    常量 int float long 与char,char[]之前转化

    char>常量

    常量转化为char、char*相对比较简单,也是调用函数atoi、atof等函数

    char* chr="123";
    int i=atoi(chr);
    float j=atof(chr);
    char ch[7]="12";
    int i=atoi(ch);
    常量>char

    在函数中也有itoa、itof等函数但是不是标准的C函数,所以很少使用。经常用到强大的函数sprintf

    char buf[256]={0};
    int i=12;
    sprintf(buf,"%d",i);
    int j=12;
    wsprintf(buf,"%d,i);
    int转为char那就没有意义了,在字符转化为常量中往往是为了计算,常量转为为字符则常用作记录、标志、命名。

    在程序中通过MFC中编辑框得到的数据为CString类型,程序中应用多为const char*、char*、char,所以这几者之间转化很频繁,关于记者之间的赋值、比较、复制也很常用。
    CSting>char* char[]

    CString str="ni hao a ";
    char ch[100]={0};
    strncpy(ch,(LPCTSTR)str,sizeof(ch));
    char *chr=null;
    chr=str.GetBuffer(str.GetLength);
    //或者是
     chr=(LPSTR)(LPCTSTR)=str;
    char[]、char*>CString

    char a[] = "This is a test";
    CString str;
    str.Format(_T("%s"), a);
    综上所述,在其他类型转化为常量时运用函数aoti,atof,在其他类型转化为CString时,则运用函数Format,其他类型转化为char,char*时较为复杂一般是相当于输入或者复制,如常量使用sprintf,CString为GetBuffer,其中char*与char[]在某种程度上是相通的,指针与数组的概念。

    在这些类型中常常还有比较、复制函数。下面就重点讲一下。

    strcpy 、strncpy

    1. strcpy函数:顾名思义字符串复制函数:原型:extern char *strcpy(char *dest,char *src); 功能:把从src地址开始且含有NULL结束符的字符串赋值到以dest开始的地址空间,返回dest(地址中存储的为复制后的新值)。要求:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
      一般函数原型实现方式:
      char * strcpy(char * strDest,const char * strSrc) 
      { 
      char * strDestCopy=strDest; //[3] 
      if ((strDest==NULL)||(strSrc==NULL)) //[1] 
      throw "Invalid argument(s)"; //[2] 
      while ((*strDest++=*strSrc++)!=''); //[4] 
      return strDestCopy; 
      } 
      该函数的参数是字符指针,也就是可以是字符串变量和字符数组,因为它们的变量名代表首字符地址。字符串默认有一个null结束符,字符数组没有。所以此处需要注意:因为src要求有null结束符,所以字符数组的长度必须大于等于src包含null结束符的总长度。例如,char* src="abcd"; char dest[5]; 这里dest的长度就至少为5。
    2. strncpy函数:多个n代表可以指定字符个数进行赋值。原型:char * strncpy(char *dest, char *src, size_tn);  功能:将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL才停止复制,而是等凑够n个字符才开始复制),返回指向dest的指针。要求:如果n > dest串长度,dest栈空间溢出产生崩溃异常。该函数注意的地方和strcpy类似,但是n值需特别注意,
      1)src串长度<=dest串长度,(这里的串长度包含串尾NULL字符) 
      如果n=(0, src串长度),src的前n个字符复制到dest中。但是由于没有NULL字符,所以直接访问dest串会发生栈溢出的异常情况。这时,一般建议采取memset将dest的全部元素用null填充,如:memset(dest,0,7)(7为从dest起始地址开始前7个位置填充null,dest可以为字符指针和数组名)。注意:char* pc="abc"; char chs[5]; sizeof(pc)为4(包含null)(有些编译器不行),sizeof(chs)为5。
      如果n = src串长度,与strcpy一致。 
      如果n = dest串长度,[0,src串长度]处存放于desk字串,(src串长度, dest串长度]处存放NULL。 
      2)src串长度>dest串长度 
      如果n =dest串长度,则dest串没有NULL字符,会导致输出会有乱码。如果不考虑src串复制完整性,可以将dest最后一字符置为NULL。
      所以,一般把n设为dest(含null)的长度(除非将多个src复制到dest中)。当2)中n=dest串长度时,定义dest为字符数组,因为这时没有null字符拷贝。

    若使用strncpy不会出错,观察内存可以发现,目标指针所指的缓冲区中完全是从源字符串拷贝过来的字符,没有/0结束符,但是若使用strcpy_s则在运行是出现断言出错,所以strncpy仍然不是安全的,因为有可能出现目标指针的字节数不足存放源指针所指向的内容。 后者之所以比前者安全,是因为他们在接口增加了一个参数numElems来表明dest中的字节数,防止目标指针dest中的空间不够而导致出现Bug,同时返回值改成返回错误代码,而不是为了一些所谓的方便而返回char*。这样接口的定义就比原来安全很多。所以往后应用中使用strcpy_s.

    strcpy、strcat

    char p1[7]="123",p2[4]="456";
    strcat(p1,p2);
    strcpy(p1,p2);
    //在dest数组中的内存大小很重要,要防止其溢出

    strcat是用来连接两个字符串的,原型是char *strcat(char *dest,char *src),作用是把src所指字符串添加到dest结尾处(覆盖dest结尾处的'')并添加''2) strcpy是用来把字符串拷贝到指定的地方的,原型是char *strcpy(char *dest,const char *src),作用是把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间注意strcat是从dest的结尾处开始操作的,而strcpy是直接覆盖dest指向的内容。3)C语言中,头文件均为<stringh>。

    strcpy、memcpy所以memcpy用处大,strcpy可以忽略了。

    strcpy和memcpy主要有以下3方面的区别。
    1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
    2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符""才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
    3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy




  • 相关阅读:
    由群里在职的同学给出污染物推断题想到的
    参考文献期刊和会议的缩写
    并行程序开发笔记
    对有关推理方法的理解---支离破碎篇
    改基金的困惑与无奈
    对生物信息学基础的补习
    DPI深度报文检测架构及关键技术实现
    OSGi 和 C++
    CentOS安装glibc-2.14,错误安装libc.so.6丢失急救办法
    误删除libc.so.6的解决方法
  • 原文地址:https://www.cnblogs.com/polly333/p/4498410.html
Copyright © 2011-2022 走看看