动态分配的聊天数组打印缺失的数据和空
dynamically allocated chat array prints missing data & empty
我正在使用xerces解析XML并构建一个以后可以遍历的内部结构。
作为此解析的一部分,我遇到了数量可变的<Field_Delimited>
元素,如下所示:
<Field_Delimited>
<name>some_value</name>
<data_type>ASCII_Real</data_type>
<unit>some_value</unit>
<description>some_value</description>
</Field_Delimited>
内存中称为file_observational_area
的结构将表示这些字段,在文件级别全局声明,请参阅相关代码段,最相关的方法是get_data((:
file_observational_area * _file_observational_area = NULL;
int main(int argc, char* args[]) {
//pass in as console argument
char* xmlFile = args[1];
//initialize file_observational_area
_file_observational_area = allocate_file_observational_area(_file_observational_area, 1);
//actual data
field_data_value * _field_data_values_array = NULL;
try {
parser->parse(xmlFile);
DOMDocument* dom = parser->getDocument();
DOMNodeList * dom_node_list = dom->getChildNodes();
for (unsigned int i = 0; i < dom_node_list->getLength(); i++) {
walk_DOM(dom_node_list->item(i), _file_observational_area);
}
get_data(_file_observational_area, xmlFile, 0, 0, 0, _field_data_values_array);
} catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
cout << "Exception message is: n"
<< message << "n";
XMLString::release(&message);
return -1;
}
}
walk_dom(( 相关代码段,它调用 parse_dom((:
void walk_DOM(DOMNode * dom_node, file_observational_area * _file_observational_area) {
if (_file_observational_area) {
_file_observational_area = parse_dom(dom_node, _file_observational_area);
}
parse_dom(( 函数相关代码段:
/*<Field_Delimited>*/
if (XMLString::equals(currentElement->getNodeName(), XMLString::transcode("Field_Delimited"))) {
/*<Field_Delimited>
<name>enc4</name>
<data_type>ASCII_Real</data_type>
<unit>rad</unit>
<description>Joint 4 encoder counts [RA_DOF]</description>
</Field_Delimited>*/
/*<Field_Delimited>*/
XMLCh* tag_Field_Delimited_name = XMLString::transcode("name");
string tag_Field_Delimited_name_val;
XMLCh* tag_Field_Delimited_data_type = XMLString::transcode("data_type");
string tag_Field_Delimited_data_type_val;
XMLCh* tag_Field_Delimited_unit = XMLString::transcode("unit");
string tag_Field_Delimited_unit_val;
XMLCh* tag_Field_Delimited_description = XMLString::transcode("description");
string tag_Field_Delimited_description_val;
DOMElement * field_delimited_element = NULL;
cout << "<Field_Delimited> DETECTEDn";
DOMNode * child = currentElement->getFirstElementChild();
while (NULL != child) {
if (DOMNode::ELEMENT_NODE == child->getNodeType()) {
if (XMLString::equals(tag_Field_Delimited_name, child->getNodeName())) {
_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].name = XMLString::transcode(child->getTextContent());
//strcpy(_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].name, XMLString::transcode(child->getTextContent()));
cout << "Debug: tag_Field_Delimited_name_val:" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].name << "n";
}
if (XMLString::equals(tag_Field_Delimited_data_type, child->getNodeName())) {
_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].data_type = XMLString::transcode(child->getTextContent());
//strcpy(_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].data_type, XMLString::transcode(child->getTextContent()));
cout << "Debug: tag_Field_Delimited_data_type_val:" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].data_type << "n";
}
if (XMLString::equals(tag_Field_Delimited_unit, child->getNodeName())) {
_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].unit = XMLString::transcode(child->getTextContent());
// strcpy(_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].unit, XMLString::transcode(child->getTextContent()));
cout << "Debug: tag_Field_Delimited_unit_val:" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].unit << "n";
}
if (XMLString::equals(tag_Field_Delimited_description, child->getNodeName())) {
_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].description = XMLString::transcode(child->getTextContent());
//strcpy(_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].description, XMLString::transcode(child->getTextContent()));
cout << "Debug: tag_Field_Delimited_description_val:" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].description << "n";
}
}
child = child->getNextSibling();
}//end while <Field_Delimited> has siblings
}//end /*<Field_Delimited>*/
}
日志显示parse_dom()
Im 能够通过XMLString::transcode(child->getTextContent())
获取正确值的预期行为,并使用_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].name = XMLString::transcode(child->getTextContent());
设置值。
问题:但是,在void get_data()
中,char 的值丢失或损坏,请参阅相关代码段:
for (int field_record_index = 0; field_record_index < _file_observational_area->_table_delimited->_record_delimited->fields; field_record_index++) {
if (NULL != _file_observational_area->_table_delimited->_record_delimited->_field_delimited) {
cout << "<Field_Delimited> number:" << field_record_index << "n";
//MISSING or corrupted name
cout << "name :" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[field_record_index].name << "n";
//MISSING or corrupted datatype
cout << "data_type:" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[field_record_index].data_type << "n";
//MISSING or corrupted unit
cout << "unit:" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[field_record_index].unit << "n";
//MISSING or corrupted description
cout << "description:" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[field_record_index].description << "n";
}
这就是我为动态字符串分配内存的方式:
/*=============================================================================
Function malloc_field_delimited
Description: allocated memory for _record_delimited->_field_delimited
* dynamic array
References:
Inputs:
Output:
==========================================================*/
field_delimited * malloc_field_delimited(field_delimited * _field_delimited, int number_of_fields) {
_field_delimited = (field_delimited*) malloc(sizeof (field_delimited) * number_of_fields);
field_delimited * field_delimited_ptr = _field_delimited;
if (_field_delimited) {
for (int i = 0; i < number_of_fields; i++) {
(field_delimited_ptr + i)->name = (char *) malloc(sizeof (char) * 256);
(field_delimited_ptr + i)->data_type = (char *) malloc(sizeof (char) * 256);
(field_delimited_ptr + i)->description = (char *) malloc(sizeof (char) * 256);
(field_delimited_ptr + i)->unit = (char *) malloc(sizeof (char) * 256);
}
} else {
printf("malloc_field_delimited(), unable to allocate memory, exiting!");
exit(1);
}
return _field_delimited;
}
我也尝试使用memset()
但它没有用,同样的问题。
为什么 get_data(( 中的字符值丢失以及如何解决此问题?
我想坚持通过char *
使用动态分配的字符串,而不是使用字符串。
谢谢一百万!
_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].name = XMLString::transcode(child->getTextContent());
您正在覆盖指针,丢失之前分配的内存。 您应该改用 strcpy。
strcpy(_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].name, XMLString::transcode(child->getTextContent()));
相关文章:
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 动态分配的聊天数组打印缺失的数据和空
- 访问和打印元组中的数据,并使用 C++14 使用模板函数显示数据
- C++ 打印包含数据结构的数组
- 从模板创建通用打印函数,以打印基元数据类型变量的值
- 打印从SQLite3数据库检索的数据C++与命令行中相同的方式
- 重写函数不打印基类数据
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- C++ 尝试优化每一帧将数据打印到二进制文件
- 使用链表数据结构打印多项式
- 如何打印在二叉搜索树中找到的数据?
- C++ Expat 仅打印元素的第一个字母和标签中的数据
- 如何在c ++中以一行(水平)打印两个文件的数据?如给定的.这两种形式来自两个不同的文本文件
- 在打印方法中,难以在二进制树中打印数据
- 是否有一个标准函数可以打印/监视stdin文件的内容,同时将数据留在stdin中
- 使用ifstream时,被调用文件中的数据不会打印
- 面临在 if 语句之外打印变量数据的问题 完成使用 Qt 编程
- C++模板方法选择正确的数据打印方式
- 无法将二维数组中的数据打印到C++的输出文件
- 在C++中读取数据列、移位、将数据打印到.txt文件