gtkmm,strncpy中文本字段的意外行为

时间:2013-09-17 14:09:08

标签: c++ gtkmm

我的结构如下

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

1 个答案:

答案 0 :(得分:1)

strncpy()不能确保生成的字符串以空值终止。如果您希望将“ab”存储在table_version_major []字段中,则需要该数组的大小至少为3个字节以允许终止'\ 0',并且您需要显式设置table_version_major [2] ='\ 0',因为strncpy()不会为你做那个。