0

我想设置路径的占位符值(类型 int):

/sys/class/gpio/gpio%d/value => /sys/class/gpio/gpio33/value

插入的值最大为 99,最小为 1。因为我不希望路径中有任何空字符,所以我希望自动确定缓冲区大小。

这就是为什么我想到了asprintf()它对字符串执行此操作,不幸的是它不适用于整数。

#define GPIO_PATH_VALUE "/sys/class/gpio/gpio%d/value"

char * path;

asprintf(path, GPIO_PATH_VALUE, 4);
asprintf(path, GPIO_PATH_VALUE, 67);

是否有类似于asprintf()的函数可以处理整数?

博多

4

2 回答 2

2

作为asprintf()一个 GNU 扩展,其他面临这个问题的人可能想要避免它。

相反,它可以这样做,例如

#define GPIO_PATH_VALUE "/sys/class/gpio/gpio%d/value"

char * path;

path = malloc(strlen(GPIO_PATH_VALUE) + 5);
// error checking needed!

sprintf(path, GPIO_PATH_VALUE, 4); // better snprintf?
// or
sprintf(path, GPIO_PATH_VALUE, 67);

path = realloc(path, strlen(path)+1);
// no error checking needed, as we definitely shrink or nop, not extend.

如果很清楚,那就GPIO_PATH_VALUE这么简单。

如果它变得更复杂,你可以做

#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>

char * vbsprintf(const char * format, va_list ap)
{
    va_list ap2;
    va_copy(ap2, ap);
    int len = vsnprintf(NULL, 0, format, ap2);
    va_end(ap2);
    char * str = malloc(len + 1);
    if (!str) return NULL;

    vsnprintf(str, len + 1, format, ap);
    return str;
}

char * bsprintf(const char * format, ...)
{
    va_list ap;
    va_start(ap, format);
    char * str = vbsprintf(format, ap);
    va_end(ap);
    return str;
}

如果您的系统支持vsnprintf(NULL, 0,以确定所需的长度。

于 2013-06-18T09:43:21.880 回答
2

试试这个作为争论asPrintf()char **看到这个http://linux.die.net/man/3/asprintf

#define GPIO_PATH_VALUE "/sys/class/gpio/gpio%d/value"

char * path;

asprintf(&path, GPIO_PATH_VALUE, 4);
asprintf(&path, GPIO_PATH_VALUE, 67);

asPrintf()函数内部的 malloc() 一样,在此函数中path不会指向分配的内存地址,因此您需要发送地址pathasPrintf()更改path将指向分配地址的 and。

于 2013-06-18T09:09:09.790 回答