2011-04-27 51 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); 
} 

而且它打印出的一切非常好...... 谢谢大家对您的意见!