如何返回char数组?

时间:2013-07-26 18:09:17

标签: c alsa

我想从snd_mixer_selem_get_id函数返回char数组:

char* alsa_get_channel_name( void )
{
    int err;
    snd_mixer_selem_id_t *sid;
    snd_mixer_elem_t *elem;

    if ((err = snd_mixer_open (&handle, 0)) < 0) {
            fprintf(stderr, "mixer: open error: %s\n", snd_strerror(err));
    }
    if ((err = snd_mixer_attach (handle, card)) < 0) {
            fprintf(stderr, "mixer: attach error: %s\n", snd_strerror(err));
    }
    if ((err = snd_mixer_selem_register (handle, NULL, NULL)) < 0) {
            fprintf(stderr, "mixer: register error: %s\n", snd_strerror(err));
    }
    if ((err = snd_mixer_load (handle)) < 0) {
            fprintf(stderr, "mixer: load error: %s\n", snd_strerror(err));
    }

    snd_mixer_selem_id_alloca(&sid);

    for (elem = snd_mixer_first_elem(handle); elem; elem = snd_mixer_elem_next(elem)) {
            if ((!snd_mixer_selem_is_active(elem))
                    continue;

            snd_mixer_selem_get_id(elem, sid);
            const char *name = snd_mixer_selem_id_get_name(sid);
            if (name)
                sprintf(name, sizeof(name), "%s", snd_mixer_selem_get_name(elem));
    }
    snd_mixer_close(handle);

    return name;
}

我不知道如何编写行sprintf(name,sizeof(name),&#34;%s&#34;,snd_mixer_selem_get_name(elem));返回频道名称。

由于

1 个答案:

答案 0 :(得分:1)

您错误地指定了对sprintf()的来电。检查man sprintfsprintf()函数将指针作为第一个参数,第二个参数应该是格式说明符。也许你的意思是使用snprintf()

  • nameconst char *,这意味着它是指向const char的指针,因此您无权写入。{/ li>
  • nameconst char *,这意味着它是指针sizeof(name)将评估指向char的指针的大小,而不是strlen(name) + 1,这似乎是假设的。
  • name是从snd_mister_selem_id_get_name()返回的指针。你甚至被允许写这个吗?您似乎试图用“混合器简单元素标识符的名称部分”覆盖“混合器简单元素标识符”(然后返回它)。但是,在开始时你的问题是“我想从snd_mixer_selem_get_id函数返回char数组”。

从snd_mixer_selem_get_id函数返回“char数组”的最简单方法是执行return snd_mixer_selem_get_name(elem)而不是尝试将sprintf()转换为某些东西......如果有理由为什么你真的需要返回相反,你可以在返回值上return strdup(snd_mixer_selem_get_name(elem)), and remember that the caller will be responsible for calling free()`。

但是,由于您的问题相当不清楚(并且ALSA文档几乎与您的问题一样不清楚),我建议您重写您的问题,准确解释您的最终目标是什么,然后重试。