当前位置:编程学习 > C#/ASP.NET >>

C++2010 .net字符串String^转Char[]数组的问题,数组赋值总是从下标4开始

由于本人初学C++,原先学习的是C#,想利用.net 环境开发,最近遇到一个很神奇的问题:

我在页面头部定义了一个结构体
typedef struct infor_field
{
char  rope_type[20];                   //被测钢丝绳型号           变长
char  working_spot[40];                //工作地点                 变长
char  device_name[40];                 //检测设备名称   变长
char  woking_time1[20];                //采样年月日   变长                     
char  woking_time2[20];                //采样时分秒   变长
char  soft_ver[20];                    //软件版本   变长
unsigned char  working_step;             //采样步长                 1个字节
float   Ch1_Adjust;  //通道一零点                4个字节
float   Ch2_Adjust;  //通道二零点  4个字节
float   Ch3_Adjust;  //通道三零点  4个字节
float   Ch4_Adjust;  //通道四零点  4个字节
float   rope_speed;                  //绳运动速度           4个字节
}INFOR_FIELD;

然后是声明:
INFOR_FIELD g_Dat_head;//文件头

然后在namespace中取得控件的文本,其中strRopeType是namespace中的全局变量,cbbRopeType是下拉框
strRopeType=cbbRopeType->Text;//赋值

然后我想把文本赋值给g_Dat_head.rope_type
char charTemp;
for (int i=0;i<strRopeType->Length;i++)
{//没办法,只能自己手动转换Char数组和字符串
//这里有个很神奇的调试器bug,g_Dat_head.rope_type[i]是从i=4开始赋值的,搞不懂
charTemp=strRopeType->ToCharArray()[i];
g_Dat_head.rope_type[i]=charTemp;
}

调试的时候发现很多问题,首先是结构体的初始化,rope_type自带乱码:

strRopeType的值:

执行几步之后,发现g_Dat_head.rope_type是从下标4开始赋值的,还有g_Dat_head中的其他字符数组都是这样的情况。请教各位前辈指点,感激不尽!

注:进入调试模式,选择即时窗口,在即时窗口中输入代码是能够正确赋值的:
--------------------编程问答-------------------- 从控件中获得的一般都是CString类型,从CString类型转换到char数组需要区分你的程序使用的字符集是UNICODE还是多字节,具体转换在网上搜索下CString char转换即可。结构体使用前先初始化下试试。
--------------------编程问答-------------------- 要用[StructLayoutAttribute(LayoutKind.Sequential)]让结构体对齐。 --------------------编程问答--------------------
引用 1 楼 redleafe 的回复:
从控件中获得的一般都是CString类型,从CString类型转换到char数组需要区分你的程序使用的字符集是UNICODE还是多字节,具体转换在网上搜索下CString char转换即可。结构体使用前先初始化下试试。

是的,经过几位前辈提醒,发现是类型没有设置好,在结构体中我应该使用wchar_t来建立数组,因为.net类型中ToCharArray貌似就是wchar_t类型。
如果使用char[],调试器显示时就会从4开始,但是如果赋值时使用[i-4],它也不会报错,输出时将数组输出也正常!唯一会出问题的时候就是退出调试时,这部分资源会无法回收,本程序就卡死了,而且使用任何终结进程的工具(包括命令行)都会使得系统假死甚至崩溃,严重者蓝屏报错。哎真是太可怕了。


引用 2 楼 devmiao 的回复:
要用[StructLayoutAttribute(LayoutKind.Sequential)]让结构体对齐。


至于前辈这个方法我还是初学者,没用过啊,求教使用方法
补充:.NET技术 ,  VC.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,