【问题标题】:Creating a new String in C for use in a large library (GLib) without using fprintf在不使用 fprintf 的情况下在 C 中创建用于大型库 (GLib) 的新字符串
【发布时间】:2015-11-27 03:39:12
【问题描述】:

(虽然这个问题一开始可能看起来特定于 GLib 或错误处理,但您实际上并不需要了解任何有关这些内容的信息来回答我的问题。)

我正在尝试使用 GLib 中的 g_set_error 来正确处理我的删除文件错误。我对 C 语言不是特别好,但我的直觉告诉我,执行以下操作可能没问题(第 3 行):

void file_delete(const gchar *name) {
    if (remove(name) != 0) {
        gchar *errmsg = ("Error deleting file %s: %s.", name, strerror(errno));
        g_set_error(NULL, SDS_ERROR, 0, errmsg);
    }
    else {
        //log file <name> deleted
    }
}

这样创建一个新字符串可以吗?或者我应该将errmsg 拆分为 3 个单独的字符串并将它们连接起来?还是其他方法?

【问题讨论】:

  • C++ != C。您似乎在谈论后者。标签已编辑。
  • 你在哪里读到过这样的语法gchar * errmsg = ("...."...)?这不是带参数的函数调用。
  • @CommanderCody 你需要像sprintf() 这样的东西。
  • 既然你已经在用GLib了,不如用他们的字符串实用方法,比如g_strdup_printf
  • 您应该注意strerror 返回的字符串 - 尽管它通常是静态字符串 - strerror 产生的错误字符串可能特定于每个系统和库实现。也可以考虑g_strerror

标签: c string error-handling glib


【解决方案1】:

不,您不能创建这样的字符串,它会返回 strerror(errno) 的结果。

在我看来,最好将多个字符串连接在一起。

但是,您可以改为这样做:

gchar *errmsg = malloc(256); // change this size as needed
snprintf(255, errmsg, "Error deleting file %s: %s.", name, strerror(errno));

如果您更喜欢格式化字符串,但别忘了free(errmsg)

更新

另外,正如@Kninnug 在问题的 cmets 中所说:

既然你已经在使用 GLib,不妨使用他们的字符串实用方法,例如 g_strdup_printf

【讨论】:

  • 谢谢,snprintfsprintf 正是我想要的。不过,我可能会采纳您的建议,然后将所有内容连接起来。
  • 对于遇到此问题并使用 GLib 的任何人,请使用 Kninnug 对问题的评论作为答案。 @NunzioTocci,您可以将其添加到答案本身吗?
  • 好主意,谢谢@Kninnug 和 CommanderCody。答案已更新。
猜你喜欢
  • 2018-11-14
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
  • 1970-01-01
  • 2017-12-07
  • 2021-11-29
相关资源
最近更新 更多