C sprintf数组中指针的可变数目

C sprintf数组中指针的可变数目,c,printf,C,Printf,我有这段代码,大部分时间都有效,但有时size小于10,如何从数组buffer轻松打印size指针?如果在临时缓冲区中格式化指针(带前导空格),然后将其与命令前缀连接起来,那么循环会怎么样 void *buffer[10]; int size = backtrace(buffer, 10); char cmd[1024]; sprintf(cmd, "addr2line -f -p -e a.out %p %p %p %p %p %p %p %p %p %p", buffer[0],

我有这段代码,大部分时间都有效,但有时
size
小于
10
,如何从数组
buffer
轻松打印
size
指针?

如果在临时缓冲区中格式化指针(带前导空格),然后将其与命令前缀连接起来,那么循环会怎么样

void *buffer[10];
int size = backtrace(buffer, 10);
char cmd[1024];
sprintf(cmd, "addr2line -f -p -e a.out %p %p %p %p %p %p %p %p %p %p",
    buffer[0],
    buffer[1],
    buffer[2],
    buffer[3],
    buffer[4],
    buffer[5],
    buffer[6],
    buffer[7],
    buffer[8],
    buffer[9],
);

如果在一个循环中格式化临时缓冲区中的指针(带前导空格),然后将其与命令前缀连接起来,该循环如何

void *buffer[10];
int size = backtrace(buffer, 10);
char cmd[1024];
sprintf(cmd, "addr2line -f -p -e a.out %p %p %p %p %p %p %p %p %p %p",
    buffer[0],
    buffer[1],
    buffer[2],
    buffer[3],
    buffer[4],
    buffer[5],
    buffer[6],
    buffer[7],
    buffer[8],
    buffer[9],
);
使用循环
sprintf()
返回写入字符数或-1:


使用循环
sprintf()
返回写入字符数或-1:



如果数组的最大大小显式地限制在
10
,只需做一个很小的修改即可:只需在适当的位置修剪格式字符串

#include <stdio.h>
int backtrace(void**, int);

void joop(void)
{

void *buffer[10];
char cmd[1024];
int size,idx;
size_t pos, len;

size = backtrace(buffer, 10);
pos= snprintf(cmd,sizeof cmd, "addr2line -f -p -e a.out");
for(idx=0 ; idx < size; idx++){
        len = snprintf(cmd+pos, sizeof cmd - pos, " %p", buffer[idx] );
        if (len < 0 || len+pos >= sizeof cmd) break;
        pos += len;
        }
}
向变量函数提供过多的变量参数并没有错


当然,插入
'\0'
的确切位置应该以更易于阅读和维护的方式计算,而不是像我上面的例子那样使用“魔法常数”。

如果数组的最大大小明确限制在
10
,您只需做一个很小的修改即可:只需在适当的位置修剪格式字符串

#include <stdio.h>
int backtrace(void**, int);

void joop(void)
{

void *buffer[10];
char cmd[1024];
int size,idx;
size_t pos, len;

size = backtrace(buffer, 10);
pos= snprintf(cmd,sizeof cmd, "addr2line -f -p -e a.out");
for(idx=0 ; idx < size; idx++){
        len = snprintf(cmd+pos, sizeof cmd - pos, " %p", buffer[idx] );
        if (len < 0 || len+pos >= sizeof cmd) break;
        pos += len;
        }
}
向变量函数提供过多的变量参数并没有错


当然,插入
'\0'
的确切位置应该以更易于阅读和维护的方式计算,而不是像我上面的例子那样使用“魔法常数”。

使用循环。(sprintf()返回写入字符数或-1)为什么要使用
void*
?@EdHeal,
man backtrace
建议的
void**
作为第一个参数。使用循环。(sprintf()返回写入字符数或-1)为什么要使用
void*
?@EdHeal,
man backtrace
建议的
void**
作为第一个参数。我明白你的意思,它在性能/性能方面不是最优的。这可以通过指针来改进,yesshoot,只是编辑为与您的解决方案相同的解决方案(几乎可以)我明白您的意思,它在性能/二次型方面不是最优的。这可以通过指针来改进,yesshoot,只需编辑为与您相同的解决方案(几乎可以),您可以使用
len=snprintf(cmd+pos,sizeof(cmd)-pos,“%p”,buffer[idx])和一个不同的错误检查来防止缓冲区溢出,不是吗?@JonathanLeffler:是的,我只是添加了
snprintf()
thingy。你可以使用
len=snprintf(cmd+pos,sizeof(cmd)-pos,“%p”,buffer[idx])和另一个防止缓冲区溢出的错误检查,你能不能?@JonathanLeffler:是的,我只是添加了
snprintf()
之类的东西。
#include <stdio.h>
int backtrace(void**, int);

void joop(void)
{

void *buffer[10];
char cmd[1024];
int size,idx;
size_t pos, len;

size = backtrace(buffer, 10);
pos= snprintf(cmd,sizeof cmd, "addr2line -f -p -e a.out");
for(idx=0 ; idx < size; idx++){
        len = snprintf(cmd+pos, sizeof cmd - pos, " %p", buffer[idx] );
        if (len < 0 || len+pos >= sizeof cmd) break;
        pos += len;
        }
}
void *buffer[10];
int size = backtrace(buffer, 10);

char format[] = "addr2line -f -p -e a.out %p %p %p %p %p %p %p %p %p %p";
format[24 + size * 3] = '\0';

char cmd[1024];
sprintf(cmd, format,
    buffer[0],
    buffer[1],
    buffer[2],
    buffer[3],
    buffer[4],
    buffer[5],
    buffer[6],
    buffer[7],
    buffer[8],
    buffer[9]
);