C函数返回gchar的问题**
-
05-07-2019 - |
题
我有一个定义如下的函数(在C中):
gchar **Scan_Return_File_Tag_Field_From_Mask_Code (File_Tag *FileTag, gchar code)
{
switch (code)
{
case 't': /* Title */
return &FileTag->title;
case 'a': /* Artist */
return &FileTag->artist;
case 'b': /* Album */
return &FileTag->album;
case 'd': /* Disc Number */
return &FileTag->disc_number;
case 'y': /* Year */
return &FileTag->year;
case 'n': /* Track */
return &FileTag->track;
case 'l': /* Track Total */
return &FileTag->track_total;
case 'g': /* Genre */
return &FileTag->genre;
case 'c': /* Comment */
return &FileTag->comment;
case 'p': /* Composer */
return &FileTag->composer;
case 'o': /* Orig. Artist */
return &FileTag->orig_artist;
case 'r': /* Copyright */
return &FileTag->copyright;
case 'u': /* URL */
return &FileTag->url;
case 'e': /* Encoded by */
return &FileTag->encoded_by;
case 'i': /* Ignored */
return NULL;
default:
Log_Print(LOG_ERROR,"Scanner: Invalid code '%%%c' found!",code);
return NULL;
}
}
我正在尝试为switch语句添加一个新条件,例如
case 'f':
它将返回<!>放大器的第一个字符; FileTag - <!> gt; artist。
我已经搜索了所有互联网寻找解决方案,但空手而归。有人有什么想法吗?
<强>更新强>
如果有帮助,此功能是EasyTag应用程序的一部分。从我看到的代码看,这是easytag的文件排序功能的新文件名确定。我正在尝试添加一个新变量,以允许应用程序将音乐排序到如下目录:<First letter of artist name>/<Artist>/<Album>/<Tracks>
我总是有机会看到错误的功能,但据我所知,我是。
另一个更新: 我得到了这个功能正常工作(指针是有趣的小东西),但它没有,如下所述,做我所期望的。感谢所有的帮助和耐心!
解决方案
我不太清楚为什么你的代码返回一个指向指针的指针,但这会使你想要的操作稍微困难一些。既然你需要返回一个指针的地址,而不仅仅是一个指针本身,你必须在某处分配那个新指针(然后谁将释放它?)。如果你不介意内存泄漏,你可以忽略这个问题,只需分配一个指针并返回它的地址。或者,您可以创建File_Tag
的新成员,该成员包含包含artist
的第一个字符的短字符串。
glib字符串函数将对此有所帮助,快速查看列表显示 g_strdup_printf()
可能有用:
gchar *first = g_strdup_printf("%c", FileTag->artist[0]);
然后分配某处存储first
并返回该地址。
其他提示
如果目标是返回指向仅包含第一个字母的字符串的指针而您不关心线程安全性,那么以下内容应该可以正常工作
static char buf[2];
static char *pbuf = buf;
...
case 'f':
buf[0] = FileTag->artist[0];
return &pbuf;
然而,我觉得很奇怪,你正在返回指向<!> quot; char <!>的指针的指针;而只是一个指向<!> quot; char <!>“。
的指针不要搜索互联网。自己编码。加上这个:
case 'f': /* Artist */
return &FileTag->artist;
假设&FileTag->artist
的类型为gchar **
。
如果可能的话,我会得到整个艺术家的字符串,然后只需从你调用该函数的地方访问第一个字母:
gchar **artist = Scan_Return_File_Tag_Field_From_Mask_Code (File_Tag *FileTag, 'f')
printf("%c", *artist[0]);
如果这不是一个选项,你可以为你的角色分配新的内存,但这是相当棘手的,因为你想返回一个指针指针。所以你必须为该指针分配内存。也许你可以改变它......