gpt4 book ai didi

c - 连接变量时如何避免 sprintf

转载 作者:行者123 更新时间:2023-11-30 19:38:07 25 4
gpt4 key购买 nike

我正在编写代码以将 USB 设备详细信息转换为单个字符串,并具有以下代码,

    struct usb_bus *bus;
struct usb_device *dev;

usb_init();
usb_find_busses();
usb_find_devices();

for (bus = usb_busses; bus; bus = bus->next)
for (dev = bus->devices; dev; dev = dev->next)
{

// working outputs
printf("Trying device %s/%s\n", bus->dirname, dev->filename);
printf("Trying device2 %0x\n", dev->descriptor.idVendor);
printf("Trying device3 %0x\n", dev->descriptor.idProduct);

char deviceDetailsStr[150];
sprintf(deviceDetailsStr, "%s_%s_%0x_%0x", bus->dirname,
dev->filename,dev->descriptor.idVendor,dev->descriptor.idProduct);

... have other code here that works on "deviceDetailsStr"
}

一直在阅读“sprintf”存在性能问题,因为它支持大量转换。

您能否建议使用“sprintf”更好的替代方案,以便将所有 4 个变量数据读入变量“deviceDetailsS​​tr”

最终目标是“deviceDetailsS​​tr”字符数组需要将所有 4 个整数作为单个字符串。

谢谢

最佳答案

如果你想要最好的性能,我会说你需要编写一些自定义的东西。这是满足您的具体要求的示例。

uint32_t printHex( char * buffer, uint32_t value ) {
uint32_t sz = value <= 0xF ? 1 :
value <= 0xFF ? 2 :
value <= 0xFFF ? 3 :
value <= 0xFFFF ? 4 :
value <= 0xFFFFF ? 5 :
value <= 0xFFFFFF ? 6 :
value <= 0xFFFFFFF ? 7 : 8;
for( uint32_t i=sz-1; i; i-- ) {
buffer[ i ] = ((value & 0xF) <= 9 ? '0' : 'a'-10 ) + (value & 0xF);
value=value>>4;
}
return sz;
}

char buffer[150];
unsigned bi=0;
for( char * ptr = bus->dirname ; *ptr; ptr++ ) buffer[bi++] = *ptr;
buffer[bi++] = '_';
for( char * ptr = bus->filename; *ptr; ptr++ ) buffer[bi++] = *ptr;
buffer[bi++] = '_';
bi += printHex( buffer + bi, dev->descriptor.idVendor );
buffer[bi++] = '_';
bi += printHex( buffer + bi, dev->descriptor.idProduct );
buffer[bi] = '\0';

注意:没有大小检查(就像 sprintf 一样)。同样,如果您想要最佳性能,这是一个权衡。

关于c - 连接变量时如何避免 sprintf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38664098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com