よく使われるタイプ変換

4955 ワード

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++)!='\0');//[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 の さの 、null コピーがないため、destを として します.
strncpyを してエラーが しない 、メモリを すると、ターゲットポインタが すバッファにはソース からコピーされた が に まれており、/0エンド はありませんが、strcpy_を するとsは にブレークスルーエラーが したため、strncpyは として ではありません.ターゲットポインタのバイト がソースポインタが す を するのに りない があります. が より なのは、インタフェースにdestのバイト を すパラメータnumElemsを し、ターゲットポインタ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    '\0')   '\0'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は さを する がなく、コピーされた の 「0」に してから するので、オーバーフローしやすい.memcpyは,その3 のパラメータに づいてコピーの さを する.
3、 が います. 、 をコピーするときはstrcpyを しますが、 のタイプのデータをコピーする がある はmemcpyを します.