alimyso 发表于 2010-8-30 17:27:41

GString基本操作一

GString是Gtk+中非常实用的一个字符串操作结构,可以使对C语言中字符串操作指针不熟悉的程序员,快速的操作字符串,而且不出错,下面的代码演示了GString操作Append(追加),Insert(指定位置插入),OverWrite(指定位置复写),Erase(指定位置删除)和Equal(比较)
作者:AlimysoYang

#include <gtk/gtk.h>

GtkWidget *wnd;
GtkWidget *vbox,*hbox,*et1,*et2,*et3,*btn,*btninsert,*btnoverwrite,*btnerase,*btnequal;

void ui_init()
{
    wnd = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(wnd),"GString about prepend");
    gtk_window_set_position(GTK_WINDOW(wnd),GTK_WIN_POS_CENTER);
   
    vbox = gtk_vbox_new(TRUE,2);
    gtk_container_add(GTK_CONTAINER(wnd),vbox);
   
    et1 = gtk_entry_new();
    et2 = gtk_entry_new();
    et3 = gtk_entry_new();
    gtk_entry_set_editable(GTK_ENTRY(et3),FALSE);
   
    hbox = gtk_hbox_new(TRUE,2);
    btn = gtk_button_new_with_label("GString prepend");
    btninsert = gtk_button_new_with_label("GString insert");
    btnoverwrite = gtk_button_new_with_label("GString overwrite");
    btnerase = gtk_button_new_with_label("GString erase");
    btnequal = gtk_button_new_with_label("GString equal");
   
    gtk_box_pack_start_defaults(GTK_BOX(vbox),et1);
    gtk_box_pack_start_defaults(GTK_BOX(vbox),et2);
    gtk_box_pack_start_defaults(GTK_BOX(vbox),et3);
    gtk_box_pack_start_defaults(GTK_BOX(vbox),hbox);
   
    gtk_box_pack_start_defaults(GTK_BOX(hbox),btn);
    gtk_box_pack_start_defaults(GTK_BOX(hbox),btninsert);
    gtk_box_pack_start_defaults(GTK_BOX(hbox),btnoverwrite);
    gtk_box_pack_start_defaults(GTK_BOX(hbox),btnerase);
    gtk_box_pack_start_defaults(GTK_BOX(hbox),btnequal);
   
    gtk_widget_show_all(wnd);
}

static void btn_clicked(GtkButton *button,gpointer user_data)
{
    const gchar *str1 = gtk_entry_get_text(GTK_ENTRY(et1));
    const gchar *str2 = gtk_entry_get_text(GTK_ENTRY(et2));
    GString *gstr = g_string_new(str1);
    g_string_prepend(gstr,str2);
    g_string_up(gstr);
    gtk_entry_set_text(GTK_ENTRY(et3),gstr->str);
    g_string_free(gstr,TRUE);
}

static void btninsert_clicked(GtkButton *button,gpointer user_data)
{
    const gchar *str1 = gtk_entry_get_text(GTK_ENTRY(et1));
    const gchar *str2 = gtk_entry_get_text(GTK_ENTRY(et2));
    GString *gstr = g_string_new(str1);
    int len = gstr->len;
    int pos = len - 2;
    if (pos<0)
    pos = 0;
    g_string_insert(gstr,pos,str2);
    g_string_down(gstr);
    gtk_entry_set_text(GTK_ENTRY(et3),gstr->str);
    g_string_free(gstr,TRUE);
}

static void btnoverwrite_clicked(GtkButton *button,gpointer user_data)
{
    const gchar *str1 = gtk_entry_get_text(GTK_ENTRY(et1));
    const gchar *str2 = gtk_entry_get_text(GTK_ENTRY(et2));
    GString *gstr = g_string_new(str1);
    int len = gstr->len;
    int pos = len - 2;
    if (pos<0)
    pos = 0;
    g_string_overwrite(gstr,pos,str2);
    gtk_entry_set_text(GTK_ENTRY(et3),gstr->str);
    g_string_free(gstr,TRUE);
}

static void btnerase_clicked(GtkButton *button,gpointer user_data)
{
    const gchar *str = gtk_entry_get_text(GTK_ENTRY(et1));
    GString *gstr = g_string_new(str);
    int len = gstr->len;
    gssize pos = len - 4;
    g_string_erase(gstr,pos,2);
    gtk_entry_set_text(GTK_ENTRY(et3),gstr->str);
    g_string_free(gstr,TRUE);
}

static void btnequal_clicked(GtkButton *button,gpointer user_data)
{
    const gchar *str1 = gtk_entry_get_text(GTK_ENTRY(et1));
    const gchar *str2 = gtk_entry_get_text(GTK_ENTRY(et2));
    GString *gstr1,*gstr2;
    gstr1 = g_string_new(str1);
    gstr2 = g_string_new(str2);
    if (g_string_equal(gstr1,gstr2))
    g_printf("the same strings\n");
    else
    g_printf("the different strings\n");
    g_string_free(gstr1,TRUE);
    g_string_free(gstr2,TRUE);
}

int main(int argc,char *argv[])
{
    gtk_init(&argc,&argv);
   
    ui_init();
   
    g_signal_connect(G_OBJECT(wnd),"destroy",G_CALLBACK(gtk_main_quit),NULL);
    g_signal_connect(G_OBJECT(btn),"clicked",G_CALLBACK(btn_clicked),NULL);
    g_signal_connect(G_OBJECT(btninsert),"clicked",G_CALLBACK(btninsert_clicked),NULL);
    g_signal_connect(G_OBJECT(btnoverwrite),"clicked",G_CALLBACK(btnoverwrite_clicked),NULL);
    g_signal_connect(G_OBJECT(btnerase),"clicked",G_CALLBACK(btnerase_clicked),NULL);
    g_signal_connect(G_OBJECT(btnequal),"clicked",G_CALLBACK(btnequal_clicked),NULL);
    gtk_main();
    return 0;
}

Tom 发表于 2010-8-30 20:04:15

GString确实很方便,不用自己去考虑空间等问题了,学习了。。。

gtk-inkscape 发表于 2010-10-30 07:07:57

先学习,再收藏。哈哈~~谢谢LZ。

liufanwei30 发表于 2010-11-10 03:12:17

页: [1]
查看完整版本: GString基本操作一