0

我的结构如下

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 次要价值:deSELECT * from SoftVer 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
4

1 回答 1

1

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

于 2013-09-17T14:42:13.897 回答