LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1228|回复: 5

请问使用glib的问题

[复制链接]
发表于 2009-5-7 22:25:14 | 显示全部楼层 |阅读模式
请问应用glib中的函数可否实现遍历目录的功能?
如果可以如何实现?

还有这么可以把一串gchar中提取出想要的数据
比如:/home/name/dir/text.c中获得name
发表于 2009-5-8 12:45:39 | 显示全部楼层
关于目录的遍历, 可以用 glib 提供的 g_dir_open() / g_dir_read_name() 自己写递归实现, 它们与 opendir() / readdir() 等其实差不多, 不过 glib 的接口具备平台无关性.

字符串处理方面, 以楼主的例子来说, g_strsplit() 刚好合适. 更复杂的情况建议使用 GRegex 类提供的相关接口, 以正则表达式的方式进行处理.

以上接口的详细说明请参考 GLib Reference Manual
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-9 10:50:27 | 显示全部楼层
请问:我写了一段对字符串操作的代码,如下:

gchar *filename;  //赋值为:/home/name/dir/text.c
gchar *temp,*temp1;
gchar *filepath;
g_strrstr(m_strtemp, "/");

temp = g_strdup (filename);
temp1 = g_strrstr(temp, "/");
m_charlong = g_printf(temp) - g_printf(temp1);
temp1 = g_strndup(temp, m_charlong);
temp = g_strdup(temp1);

g_sprintf(filepath, "%s", m_strtemp);  //执行到这的时候,最初的filename的值也会变成filepath中的值

这是为什么??除了g_printf还有没有别的获取字符串长度的函数?因为这个函数会打印……而且是在关闭程序的时候才出现。

再问:如何把char转换成long或int?有没有类似atoi这种函数?
回复 支持 反对

使用道具 举报

发表于 2009-5-11 09:50:51 | 显示全部楼层
[PHP]
gchar *filename; //赋值为:/home/name/dir/text.c
gchar *temp,*temp1;
gchar *filepath;
g_strrstr(m_strtemp, "/"); /* XXX: m_strtemp 是什么, 有初值么? 此句的返回值是否忘了赋给谁 */

temp = g_strdup (filename);
temp1 = g_strrstr(temp, "/");
m_charlong = g_printf(temp) - g_printf(temp1); /* XXX: 想不出为什么要用 g_printf(). 如果 temp/temp1 中有特殊转义符就可能导致内存非法访问之类的问题. 也许楼主的本意是想用 strlen() 但是又找不到 glib 中对应的函数. 那就直接用 strlen() 好了, 这是 C 标准中的东西, 不影响平台无关性的. 另外, 这里直接用 temp1 - temp 可以更快地得到结果 */
temp1 = g_strndup(temp, m_charlong);
/* XXX: 这里应该加一句 g_free(temp); */
temp = g_strdup(temp1);

/* XXX: 和之前一样, m_strtemp 的内容是什么, 有多长, 这都可能导致 filepath 溢出. 但更关键的, filepath 从以上代码来看根本没有分配空间, 为野指针, 那么会导致楼主提到的问题就不奇怪了 */
g_sprintf(filepath, "%s", m_strtemp); //执行到这的时候,最初的filename的值也会变成filepath中的值
[/PHP]

P.S. 如果楼主感觉 glib 提供的字符串处理不能满足自己的需求, 或是不好理解的话, 那就不要勉强自己使用它们, 还是直接手工操作字符串比较省事
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-13 22:22:28 | 显示全部楼层
哎~开始也是追求代码风格的统一性,看的文档说glib中的函数大部分继承C标准函数并且增加了保护机制,所以追求统一用glib的函数。
不过后来连atoi这种函数都没有,很受打击……
谢谢四楼啦,那个代码是我从我的代码中摘的,释放什么的都是些了的……
回复 支持 反对

使用道具 举报

发表于 2009-5-14 09:03:45 | 显示全部楼层
glib是posix c的补充而已,并不是替代。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表