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() は、結果の文字列が null で終わることを保証しません。"ab" が table_version_major[] フィールドに格納されることを期待している場合は、その配列のサイズが少なくとも 3 バイトである必要があり、終端の '\0' を許可し、明示的に設定する必要があります。 table_version_major[2] = '\0' は、strncpy() がそれを行わないためです。

于 2013-09-17T14:42:13.897 に答える