2011-04-27 54 views
1

我正在編寫一個c庫,但在我想測試函數之前。所以,我做到以下幾點:在C中使用glib函數獲取交互輸入

int main(void) 
{ 
GString *msg = NULL; 
msg = g_string_sized_new(256); 
printf ("Insert a string (255 characters at most): "); 
do_fgets((char *) msg->str, (size_t) msg->len, stdin); 
printf("msg->allocated_len = %u \n", (size_t) msg->allocated_len); 
printf("msg->len = %u \n", (size_t) msg->len); 

return 0; 
} 

編譯是好的,但該程序打印如下: MSG-> allocated_len = 512 MSG-> LEN = 0

爲什麼呢?有沒有其他方法可以使用glib函數從用戶那裏獲得交互式輸入?

如果有人能幫助我,我將不勝感激!

+0

我不明白你想要什麼,你想要什麼樣的輸入?什麼是GString(除了吉他弦)? 編輯:我只是看着它,從我理解你想使用標準的ANSI C函數嗎?您可以簡單地使用scanf()從標準輸入讀取。 – 2011-04-27 14:56:07

+2

@Ricardo Ferreira - 與吉他相比,至少有一種更常見的g-string用法。 ;) – Duck 2011-04-27 15:06:18

回答

1

我假設do_fgets是你自己的功能包裝fgets,反正...

您的代碼失敗,因爲它試圖讀取0字節(的msg->len初始值)。此外,msg->len從不更新(它通過值傳遞給do_fgets)。

+0

好的,讓我澄清一下; do_fgets就像fgets(),所以忘了它,並從現在開始讓它成爲fgets()。 GString是glib.h的一個結構,如下定義:http://developer.gnome.org/glib/unstable/glib-Strings.html我想要的是從用戶讀取一個字符串並將其存儲在GString-> str 。我如何啓動len成員(不應該自動發生?)。我知道在第4行中爲GString分配期間,allocated_len成員設置爲512. – xtsop 2011-04-27 16:43:19

+0

@xstop:如果您使用的是'g_string_' *函數之一,它會自動發生。因爲你不是,你應該將'len'成員設置爲字符串的實際長度(不包括終止的nul字節)。您可以使用'allocated_len'作爲要讀取的字節數等等。 – Hasturkun 2011-04-27 18:04:33

0

Resurection! 我想我已經找到了解決我的問題。我所做的是將輸入讀入緩衝區,然後將緩衝區分配給結構成員src,一切正常。這是大致的代碼:

int main(void) 
{ 
    GString *msg = NULL; 
    gchar *p; 
    gchar buf[256]; 
    msg = g_string_sized_new(256); 
    printf ("Enter a message (255 characters at most): "); 
    p = fgets(buf, sizeof(buf), stdin); 
    g_string_assign(msg, buf); 
    printf("msg->str = [%s] \n", (char *) msg->str); 
    printf("msg->len = %u \n", (size_t) msg->len); 
    printf("msg->allocated_len = %u \n", (size_t) msg->allocated_len); 
    return 0; 
} 

所以它打印出:

msg->str = [this is my message] 
msg->len = 19 
msg->allocated_len = 512 

唯一奇怪的是,爲什麼allocated_len是512而不是256 感謝大家的答覆...

+0

您應該使用已發佈的另一個問題。無論如何; GString以2的冪率展開。當您調用g_string_sized_new(256)時,表示您希望爲256個字符預先分配足夠的空間(內部:爲其末尾放置的\ 0字符+1)。因爲這257變成了最接近的2(2^8-> 2^9)的冪,使最終的allocation_len 512成爲你期望的結果。 – Wiz 2011-11-05 19:55:42

0

復活,調試使我轉向下一個解決方案。謝謝Hasturkun的幫助,我想從昨天起發佈我的答案,但新成員在8小時過後才能回答他們的問題。解決的辦法是這樣的:

int main(void) 
{ 
    GString *msg = NULL; 
    gchar *p; 
    gchar buf[256]; 

    msg = g_string_sized_new(256); 
    printf ("Enter a message (255 characters at most): "); 
    p = fgets(buf, sizeof(buf), stdin); 
    g_string_assign(msg, buf); 
    printf("msg->str = [%s] \n", (char *) msg->str); 
    printf("msg->len = %u \n", (size_t) msg->len); 
    printf("msg->allocated_len = %u \n", (size_t) msg->allocated_len); 
} 

而且它打印出的一切非常好...... 謝謝大家對您的意見!