我的结构如下
typedef struct
{
char table_version_major[2];
char table_version_minor[2];
} SOFT_VER_DATA;
#define Soft_Ver_Total_Datasets 1;
我使用以下功能
void prepare_Soft_Ver_File_for_Upload(void)
{
Glib::ustring l_temp;
int l_data_sets=0;
char l_query_string [100];
SOFT_VER_DATA l_soft_ver_data[Soft_Ver_Total_Datasets];
SACommand* l_db_cmd=get_database_command_object();
string l_profile = g_profile_label->get_text();
sprintf(l_query_string,"SELECT * from SoftVer WHERE PROF = "%s",l_prof_name.data());
set_sql_query(l_query_string);
execute_sql_query();
while(l_db_cmd->FetchNext())
{
l_temp=l_db_cmd->Field("PROF1_1").asString(); //PROF1_1 is an access database column, 1st entry contains abc
strncpy(l_soft_ver_data[l_datasets].table_version_major,l_temp.data(),2);
cout<<"\n Major Value: "<<l_soft_ver_data[l_datasets].table_version_major;
l_temp=l_db_cmd->Field("PROF1_2").asString();
//PROF1_2 is an access database column, 1st entry contains def
strncpy(l_soft_ver_data[l_datasets].table_version_minor,l_temp.data(),2);
cout<<"\n Minor Value: "<<l_soft_ver_data[l_datasets].table_version_minor;
l_data_sets++;
}
当我运行程序时,我希望主要值为“ab”,而次要值为“de”。程序输出如下。
主要价值:ab 次要值:来自SoftVer的deSELECT * WHERE PROF ='new_prof'
我尝试使用以下
将其余字节归零 l_soft_ver_data[l_datasets].table_version_major=0;
l_soft_Ver_data[l_datasets].table_version_minor=0;
现在我得到了正确的输出但是当我用gktmm文本字段读取这些值时,我得到了
abde(和一些阴影方块)
和
gh(和一些阴影方块)
这是我的gtkmm部分
m_row[m_soft_model.table_version_major] = m_soft_ver_data[l_i].table_version_major;
m_row[m_soft_model.table_version_minor] = m_soft_ver_data[l_i].table_version_minor;
Both are Glib::ustring
答案 0 :(得分:1)
strncpy()不能确保生成的字符串以空值终止。如果您希望将“ab”存储在table_version_major []字段中,则需要该数组的大小至少为3个字节以允许终止'\ 0',并且您需要显式设置table_version_major [2] ='\ 0',因为strncpy()不会为你做那个。