热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

字节码问题wchar和char的区别以及wchar和char之间的相互转换字符编码转换等方法及函数介绍...

2019独角兽企业重金招聘Python工程师标准收集了一些关于字符宽字符的一些资料,在此与大家一起分享。win2下wchar占2个字节linux下wchar占4

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

收集了一些关于字符/宽字符的一些资料,在此与大家一起分享。

win2下wchar占2个字节   linux下wchar占4个字节

wchar_t的高位字节应该存储在char数组的低位字节。

在 C 语言中, char 类型永远都是一个字节, 双字节字符类型是 wchar_t;但它不是内置类型, 定义在 stddef.h.

给 wchar_t 类型的字符或字符数组(也就是字符串)赋值要冠以 L;

格式化输出(如 printf) wchar_t 类型的字符串, 要用 %S(而非 %s)。(我更多的是看到用ls输出);

而且 要注意一点,printf和wprintf不能混用,否则不会打印。如:

setlocale(LC_ALL,"zh_CN.utf8");
printf(
"1 print chinese by wprintf test: \n");
wchar_t
*wstr = L"中文";
wprintf(L
"%ls",wstr);

上面先使用了printf,又使用了wprintf,所以后面的wprintf无法正常输出,只要把上面printf换成wprintf或是注释掉就可以了。


mbs: multi byte string, 用char作为存储类型, 一个字符可能对应1个或者多个char, 不能直接确定字符边界. charset不确定. 过去的程序都是采用mbs的.

wcs: wide character string, 用wchar_t作为存储类型, 一个字符对于一个wchar_t. 使用unicode编码, charset与OS相关, 在windows平台中为UTF16(UCS-2), 在大多数unix平台中为UTF32(UCS-4).

国际化的程序都应该在内部使用wcs, 在输入输出时做mbs与wcs的转换.

#include <stdlib.h> #include <stdio.h> #include <locale.h> int main()
{FILE
* fp ;setlocale(LC_ALL,""); //要先设置语言环境 wchar_t wchar[5] &#61; L"相等相等"; //定义一个宽字节的变量&#xff0c;初始为"相等" fp &#61; fopen("1.txt", "w&#43;"); //打开文件称奥做 fwprintf(fp, L"%ls\n", wchar); //输出到文件.此处一定要为%ls&#xff0c;不能用%s fclose(fp); //关闭文件 wchar_t wc2[5]; //定义第二个宽字节变量 int i &#61; 0; //wc开始的有很多宽字节的操作。都和str相对应。 wcscpy(wc2, wchar); //复制。 int n &#61; wcscmp(wc2, wchar); //比较 if (n &#61;&#61; 0){wprintf(L"相等\n"); } else {wprintf(L"不相等\n");} char str[10]; //定义char字符。 n &#61; wcstombs(str, wc2, 9); //宽字节转换为muiltychar printf("1---: %s\n", str); //输出结果 for (i &#61; 0; i < 5; &#43;&#43;i){wc2[i] &#61; L&#39;1&#39; &#43; i;}wc2[4] &#61; 0;n &#61; wcstombs(str, wc2, 9); //宽字节转换为muiltychar printf("2---:%s\n", str); //输出结果 return 0;
}

mbswcs的转换函数:

#include <locale.h> setlocale(LC_ALL, "");wcstombs(char * to,wchar_t * from,size_t _maxCount);
mbstowcs(wchar_t
* to,char * from,size_t _maxCount);

wcstombs/mbstowcs是实现转换的一对函数. 这两个c的库函数其实内部也就是对刚刚windowsapi和接下来我们要说的iconv的封装。使用时要注意&#xff0c;如果涉及到中文&#xff0c;要先setlocale&#xff0c;当设置好正确的locale&#xff0c;函数内部才能找到正确的字符集进行转换。

wcs的charset是固定不可变的, 但是mbs的charset是可变的, 可能是ASCII, 可能是gb2312, 也可能是big5. wcstombs/mbstowcs是根据locale环境设置来决定mbs采用的charset的, 在程序中可以用setlocale来设定locale, 例如 setlocale(LC_ALL, "chinese")

程序启动时, locale设定为 LC_ALL&#61;"C", 用 setlocale(LC_ALL, "") 就可以设置成操作系统的locale设定.

Locale决定了当前程序运行的本地化设置方式, 但是在程序中可能需要作其他charset的转换, 例如程序本身语言设定为简体中文, 需要做big5与unicode的转换, 或者是其他两种charset的mbstombs转换, 这时wcstombs/mbstowcs就不能胜任了.

/* linux 下 wchar_t和char的相互转化和测试
win32下wchar_t占2个字节&#xff0c;linux下wchar_t占4个字节。wchar_t的高字节应该存放在char数组的低字节。
Linux下面的没有命名为 WideCharToMultiByte() 和 MultiByteToWideChar() 函数&#xff0c;WideCharToMultiByte&#xff0c;MultiByteToWideChar是windows下的函数&#xff0c;
在linux下也有类似的两个函数&#xff1a;
mbstowcs()
wcstombs()
值得注意的是:
size_t mbstowcs(wchar_t *wcstr,const char *mbstr,size_t count);
这个函数的第三个参数count&#xff0c;大小一定要是mbstr长度的2倍&#xff0c;否则出来的中文也会是乱码。wcstombs和mbstowcs使用
#include
setlocale(LC_ALL, "");
wcstombs(char * to,wchar_t * from,size_t _maxCount);
mbstowcs(wchar_t * to,char * from,size_t _maxCount);还有呢&#xff0c;转码还可以使iconv函数族&#xff0c;包含以下三个函数&#xff08;其具体实例可以见demo_iconv.c和code_convert.c&#xff09;&#xff1a;
iconv_t iconv_open(const char *tocode, const char *fromcode);
size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
int iconv_close(iconv_t cd);
*/ #include <stdlib.h> #include <stdio.h> #include <string.h> #include <locale.h> size_t get_wchar_size(const char *str)
{size_t len
&#61; strlen(str);size_t size&#61;0;size_t i; for(i&#61;0; i < len; i&#43;&#43;){ if( str[size] >&#61; 0 && str[size] <&#61; 127 ) //不是全角字符 size&#43;&#61;sizeof(wchar_t); else //是全角字符&#xff0c;是中文 {size&#43;&#61;sizeof(wchar_t);i&#43;&#61;2;}} return size;
}
char *w2c(const wchar_t *pw)
{
if(!pw) return NULL;size_t size&#61; wcslen(pw)*sizeof(wchar_t); char *pc; if(!(pc &#61; (char*)malloc(size))){printf("malloc fail"); return NULL;}wcstombs(pc,pw,size); return pc;}wchar_t *c2w(const char *pc)
{
if(!pc) return NULL;size_t size_of_ch &#61; strlen(pc)*sizeof(char);size_t size_of_wc &#61; get_wchar_size(pc);wchar_t *pw; if(!(pw &#61; (wchar_t*)malloc(size_of_wc))){printf("malloc fail"); return NULL;}mbstowcs(pw,pc,size_of_wc); return pw;} int main(void)
{setlocale(LC_ALL,
"zh_CN.utf8");printf("1 print chinese by wprintf test: \n");wchar_t *wstr &#61; L"中文"; //wprintf(L"%ls",wstr); //此处不要使用wprintf&#xff0c;因为上面已经使用了printf&#xff0c;而他们使用的是不同的流&#xff0c;不能混用 printf("%ls\n",wstr); //ls printf("2 print chinese by printf test: \n"); char *str &#61; "汉字";printf("%s\n\n\n",str); //s printf("3 char and wchar_t size of system test: \n");printf("%s%d\n","the size of wchar_t is : ",sizeof(wchar_t)); //4 printf("%s%d\n\n\n","the size of char is : ",sizeof(char)); //1 char *pc;wchar_t *pw &#61; L"中文是abc一门语言abc"; char *tmp &#61; "中文是abc一门语言abc";printf("%s%s\n","input test wchar_t* ",tmp);pc &#61; w2c(pw);printf("4 print char test after w2c (wchar to char):\n");printf("%s\n",pc);wchar_t *cw1 &#61; c2w(pc); //char to wchar char *wc1 &#61; w2c(cw1); //wchar to char printf("5 print char test after w2c c2w and w2c:\n");printf("%s\n\n\n",wc1); char *pmc &#61; "abc中文abc";wchar_t *pmw;printf("%s%s\n","input test char* ",pmc);pmw &#61; c2w(pmc); char *pmc1 &#61; w2c(pmw);printf("6 print char test after c2w and w2c:\n");printf("%s\n",pmc1);printf("%ls\n",wstr); //cout< return 0;}


unix平台中可以使用iconv来做这个转换(iconv lib也有windows版本), windows平台可以用MultiByteToWideChar/WideCharToMultiByte 函数.

iconv库的使用

利用iconv函数族进行编码转换&#xff08;如GB2312转换为UTF-8&#xff09;

iconv函数族的头文件是iconv.h,使用前需包含之。

#include

iconv函数族有三个函数,原型如下:

(1) iconv_t iconv_open(const char *tocode, const char *fromcode);

       此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。

(2)size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);

       此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。参数cd必须是由iconv_open函数创建的转换描述符。

/* iconv库的使用GB2312字符串转换为UTF-8的字符串利用iconv函数族进行编码转换iconv函数族的头文件是iconv.h,使用前需包含之。#include iconv函数族有三个函数,原型如下:(1) iconv_t iconv_open(const char *tocode, const char *fromcode);此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。(2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。(3) int iconv_close(iconv_t cd);此函数用于关闭转换句柄,释放资源。 */ #include <stdio.h> #include <stdlib.h> #include <iconv.h> #include <string.h> int main(void)
{unsigned
char *src &#61; "魅影追击和歌姬"; /* 需转换的字串 */ unsigned char dst[256] &#61; {0}; /* 转换后的内容 */ unsigned char buf[1024] &#61; {0}; /* 格式化转换后的字串 */ size_t src_len &#61; strlen(src);size_t dst_len &#61; sizeof(dst);unsigned char *in &#61; src;unsigned char *out &#61; dst;iconv_t cd; int i; int j; cd &#61; iconv_open("UTF-8", "GB2312"); /* 将GB2312字符集转换为UTF-8字符集 */ if ((iconv_t)-1 &#61;&#61; cd){ return -1;}printf("src: %s\n", src);iconv(cd, &in, &src_len, &out, &dst_len); /* 执行转换 */ /* 以下将转换后的内容格式化为: %XX%XX...形式的字串 */ printf("dst: ");j &#61; 0; for (i &#61; 0; i < strlen(dst); i&#43;&#43;){printf("%.2X ", dst[i]);buf[j&#43;&#43;] &#61; &#39;%&#39;;snprintf(buf &#43; j, 3, "%.2X", dst[i]);j &#43;&#61; 2;}printf("\n");printf("buf: %s\n", buf);iconv_close(cd); /* 执行清理 */ return 0;
}

大部分情形是inbuf 不为NULL&#xff0c;*inbuf也不为NULL。这种情况下&#xff0c;iconv函数将以*inbuf起始的多字节序列转换到以*outbuf起始的多字节序列。从*inbuf开始读取,最多*inbytesleft字节&#xff0c;转换后&#xff0c;从*outbuf开始写入,最多*outbytesleft字节。iconv函数一次转换一个多字节字符&#xff0c;每次字符转换&#xff0c;*inbuf增加已转换的字节数&#xff0c;*inbytesleft相应地减少已转换的字节数&#xff1b;对应地&#xff0c;*outbuf和*outbytesleft作相应的修改&#xff0c;同时修改cd的转换状态。

以下四种情况不能完成转换&#xff1a;

1&#xff0e;输入中含无效的多字节序列。此时&#xff0c;它将errno设置为EILSEQ并返回(size_t)(-1)。*inbuf指向无效序列的最左端。

2&#xff0e;输入的字节序列已经全部被转换过&#xff0c;也就是*inbytesleft减少至0。此时&#xff0c;iconv返回本次调用中完成转换的数目&#xff08;可逆的转换不计入&#xff09;。

3&#xff0e;输入中以不完整多字节序列作结尾。此时&#xff0c;它将errno设置为EINVAL并返回(size_t)(-1)。*inbuf指向不完整多字节序列的最左端。

4&#xff0e;输出缓存区没有足够空间来存储下一个字符。此时&#xff0c;它将errno设置为E2BIG并返回(size_t)(-1)。

另一种情形是inbuf 为NULL或*inbuf为NULL&#xff0c;但*outbuf 不为NULL&#xff0c;*outbuf也不为NULL。这种情况下&#xff0c;iconv函数试图将cd的转换状态设置为初始状态并store a corresponding shift sequence at *outbuf。从*outbuf开始&#xff0c;最多写入*outbytesleft字节。如果输出缓存区没有足够空间来存储这个重置后的序列&#xff0c;他将errno设置为E2BIG并返回(size_t)(-1)。反之&#xff0c;*outbuf增加写入的字节数和*outbytesleft减少写入的字节数。

第三种情形是inbuf 为NULL或*inbuf为NULL&#xff0c;*outbuf 为NULL或*outbuf为NULL。这种情况下&#xff0c;iconv函数试图将cd的转换状态设置为初始状态。


返回值

iconv函数返回本次调用中转换的字符数&#xff0c;可逆的转换不计入。出错时&#xff0c;它将修改errno并返回(size_t)(-1)。

错误

除了其它错误以外&#xff0c;出现以下错误&#xff1a;

E2BIG

*outbuf没有足够的空间。

EILSEQ

    输入含无效的多字节序列。

EINVAL

    输入含不完整多字节序列。

(3) int iconv_close(iconv_t cd);

       此函数用于关闭转换句柄,释放资源。

这个库使用很简单&#xff0c;使用举例&#xff1a;

int gbk2utf8(char *dst, int outlen,char *src,int inlen)
{
static iconv_t its_conv; char *p1;its_conv &#61; iconv_open("UTF-8","GBK"); const char* p &#61; src;p1 &#61; dst;iconv(its_conv, &p, &inlen, &p1, &outlen); //printf("%s\n",out); iconv_close(its_conv); return 0;
}

网上一个人写的支持windows和linux的wchar_t与UTF-8编码之间的转换和UTF-16和wchar_t之间的转换代码

#ifdef WINDOWS #include <windows.h> #include <stdio.h> #include <ctype.h> #else #include <iconv.h> #include <wctype.h> #include <wchar.h> #include <errno.h> #endif //wchar_t转成UTF-8 int FW2UTF8Convert( const wchar_t* a_szSrc, int a_nSrcSize, char* a_szDest, int a_nDestSize )
{ #ifdef WINDOWS
return WideCharToMultiByte( CP_UTF8, 0, a_szSrc, -1, a_szDest, a_nDestSize, NULL, NULL ); #else size_t result; iconv_t env; env &#61; iconv_open("UTF-8","WCHAR_T"); if (env&#61;&#61;(iconv_t)-1) { printf("iconv_open WCHAR_T->UTF8 error%s %d\n",strerror(errno),errno) ; return -1; } result &#61; iconv(env,(char**)&a_szSrc,(size_t*)&a_nSrcSize,(char**)&a_szDest,(size_t*)&a_nDestSize); if (result&#61;&#61;(size_t)-1) { printf("iconv WCHAR_T->UTF8 error %d\n",errno) ; return -1; } iconv_close(env); return (int)result; #endif } //UTF-8转成wchar_t int FUTF82WConvert( const char* a_szSrc, wchar_t* a_szDest, int a_nDestSize )
{ #ifdef WINDOWS
return MultiByteToWideChar( CP_UTF8, 0, a_szSrc, -1, a_szDest, a_nDestSize ); #else size_t result; iconv_t env; int size &#61; strlen(a_szSrc)&#43;1 ; env &#61; iconv_open("WCHAR_T","UTF-8"); if (env&#61;&#61;(iconv_t)-1) { printf("iconv_open UTF8->WCHAR_T error %d\n",errno) ; return -1; } result &#61; iconv(env,(char**)&a_szSrc,(size_t*)&size,(char**)&a_szDest,(size_t*)&a_nDestSize); if (result&#61;&#61;(size_t)-1) { printf("iconv UTF8->WCHAR_T error %d\n",errno) ; return -1; } iconv_close(env); return (int)result; #endif } //wchar_t转成utf16 int FW2UConvert( const wchar_t* a_szSrc, int a_nSize,char* a_szDest, int a_nDestSize )
{ #ifdef WINDOWS memcpy_s((wchar_t
*)a_szDest,a_nDestSize,a_szSrc,a_nSize); return a_nSize ; #else size_t result; iconv_t env; env &#61; iconv_open("UCS-2-INTERNAL","UCS-4-INTERNAL"); if (env&#61;&#61;(iconv_t)-1) { printf("iconv_open WCHAR_T->UTF16 error%s %d\n", strerror(errno),errno); return -1; } result &#61; iconv(env,(char**)&a_szSrc,(size_t*)&a_nSize,(char**)&a_szDest,(size_t*)&a_nDestSize); if (result&#61;&#61;(size_t)-1) { printf("iconv WCHAR_T->UTF16 error %s %d\n", strerror(errno), errno); return -1; } iconv_close(env); return (int)result; #endif } //utf16转成wchar_t int FU2WConvert( const char* a_szSrc, int a_nSize, wchar_t* a_szDest, int a_nDestSize )
{ #ifdef WINDOWS memcpy_s(a_szDest,a_nDestSize,(
const wchar_t*)a_szSrc,a_nSize); return a_nSize ; #else size_t result; iconv_t env; env &#61; iconv_open("UCS-4-INTERNAL","UCS-2-INTERNAL"); if (env&#61;&#61;(iconv_t)-1) { printf("iconv_open error %d\n",errno) ; return -1; } result &#61; iconv(env,(char**)&a_szSrc,(size_t*)&a_nSize,(char**)&a_szDest,(size_t*)&a_nDestSize); if (result&#61;&#61;(size_t)-1) { printf("UTF16 -> WCHAR_T conv error %d\n",errno) ; return -1; } iconv_close(env); return (int)result; #endif }

 

网上不错的资源&#xff1a;

C/C&#43;&#43; 编程中多国语言处理

http://www.ibm.com/developerworks/cn/linux/l-cn-ccppglb/index.html?ca&#61;drs-

彻底解密C&#43;&#43;宽字符&#xff1a;1、从char到wchar_t

http://blog.csdn.net/wallaceli1981/archive/2010/07/16/5740615.aspx

彻底解密C&#43;&#43;宽字符&#xff1a;2、Unicode和UTF

http://blog.csdn.net/wallaceli1981/archive/2010/07/16/5740616.aspx

彻底解密C&#43;&#43;宽字符&#xff1a;3、利用C运行时库函数转换

http://blog.csdn.net/wallaceli1981/archive/2010/07/16/5740618.aspx

彻底解密C&#43;&#43;宽字符&#xff1a;4、利用codecvt和use_facet转换

http://blog.csdn.net/wallaceli1981/archive/2010/07/16/5740620.aspx

彻底解密C&#43;&#43;宽字符&#xff1a;5、利用fstream转换

http://blog.csdn.net/wallaceli1981/archive/2010/07/16/5740621.aspx

彻底解密C&#43;&#43;宽字符&#xff1a;6、国际化策略

http://blog.csdn.net/wallaceli1981/archive/2010/07/16/5740622.aspx

C 源文件内的中文(1)

http://hi.baidu.com/cyclone/blog/item/e48c76099b002ca22eddd4c3.html

C 源文件内的中文(2)

http://hi.baidu.com/cyclone/blog/item/25b262d973e9d72111df9bcf.html

UTF-8 and Unicode FAQ for Unix/Linux

http://blog.csdn.net/lovekatherine/archive/2007/08/30/1765903.aspx


转:https://my.oschina.net/michael1986/blog/175652



推荐阅读
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • 《2017年3月全国计算机等级考试二级C语言上机题库完全版》由会员分享,可在线阅读,更多相关《2017年3月全国计算机等级考试二级C语言上机题库完全版( ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
author-avatar
昂-恩意_180
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有