Xcode下一个字符串拷贝的问题,弄了半天没太搞清楚是什么原因。
主函数是这样的:
char* Convertvalue(Tuple &tuple)
{
string value = "";
int tupleLength = (int)tuple.length();
std::cout<<tuple.length()+2<<std::endl;
char *p = (char*)malloc((tupleLength+2)*sizeof(char));
// char *p = new char[tupleLength+2];
memset(p, 0, tuple.length()+2);
char *v = p;
int ivalue;
float fvalue;
for(int i=0;i<tuple.attr_count;i++)
{
if(tuple.attrs[i].attr_type == CHAR)
{
std::cout<<tuple.attr_values[i].data()<<endl;
strcpy(v,tuple.attr_values[i].data());
v += tuple.attr_values[i].size();
}
if(tuple.attrs[i].attr_type == INT)
{
ivalue = atoi(tuple.attr_values[i].c_str());
memcpy(v, &ivalue, 4);
v += 4;
}
if(tuple.attrs[i].attr_type == FLOAT)
{
fvalue = (float) atof(tuple.attr_values[i].c_str());
memcpy(v,&fvalue,4);
v += 4;
}
}
std::cout<<*p<<std::endl;
return p;
}
其中tuple的结构如下:
struct Table
{
string table_name; //表名
int attr_count; //表中属性的总个数
Attribute attrs[32]; //表的所有属性列表, 最多32个属性
//return primary key id
int getPrimaryKeyId() {
for (int i = 0; i < attr_count; ++i)
{
if (attrs[i].attr_key_type == PRIMARY)
{
return i;
}
}
//if no primary key
return -1;
}
int searchAttrId(string att_name) {
for (int i = 0; i < attr_count; ++i)
{
if (attrs[i].attr_name == att_name)
{
return i;
}
}
//if no primary key
return -1;
}
int length()
{
int len = 0;
for (int i = 0; i < attr_count; ++i)
{
len += attrs[i].attr_len;
}
return len;
}
};
struct Tuple: public Table
{
string attr_values[32];
};
一个tuple实例化例子:
Tuple tuple1;
//tuple继承了table的public属性并且用到了,所以这边我先模拟一下
//实际上可以用memcpy来搞这个事情
tuple1.table_name = "test_table6";
tuple1.attr_count = 3;
tuple1.attrs[0].attr_name="id";
tuple1.attrs[0].attr_type=INT;
tuple1.attrs[0].attr_key_type=PRIMARY;
tuple1.attrs[0].attr_len=1;
tuple1.attrs[1].attr_name="name";
tuple1.attrs[1].attr_type=CHAR;
tuple1.attrs[1].attr_key_type=EMPTY;
tuple1.attrs[1].attr_len=31;
tuple1.attrs[2].attr_name="age";
tuple1.attrs[2].attr_type=INT;
tuple1.attrs[2].attr_key_type=EMPTY;
tuple1.attrs[2].attr_len=1;
//插入的时候我们需要注意的是,我们这里基本上都转化成字符串插入了,int和浮点数什么的,要写成字符串,否则会出错
tuple1.attr_values[0]="18";
tuple1.attr_values[1]="xiaotao4";
tuple1.attr_values[2]="25";
最后那个返回的char* p 并不是一个预期的字符串,而是一个"x12",只是包含第一个内容。
我表示不知道为什么出现这样的问题....
ivalue = atoi(tuple.attr_values[i].c_str());
memcpy(v, &ivalue, 4);
十进制的18就是16进制的12啊,你自己转成INT存的地址。