值:
hw:2,0
我想用 dsnoop
替换:之前的字符串结果:
dsnoop:2,0
或使用dsnoop
hw
我有这个功能来找到无用的设备
bool useless_device(char *device) {
char *example[] = { "dsnoop", "dmix", "hw" };
for (int i = 0; i < ARRAY_SIZE(example); i++) {
int l = strlen(example[i]);
if (device && strncmp (device, example[i], l) == 0 && (!device[l] || device[l] == ':'))
return true;
}
return false;
}
我正在尝试创建一个将字符串作为输入并将hw
替换为dsnoop
的函数(反之亦然)。
因此,对于"hw:x,y"
,应返回"dsnoop:x,y"
(反之亦然)。
char *useless_device(const char *device) {
int i, j;
char *useless[] = { "dsnoop", "hw" };
char *result = NULL;
char *dev;
dev = g_strdup(device);
for (i = 0; i < ARRAY_SIZE(useless); i++) {
char *buf;
int len = strlen(useless[i]);
if (strncmp (dev, useless[i], len) == 0 && (!dev[len] || dev[len] == ':')) {
buf = g_strdup (&dev[len]);
j = (i + 1) % ARRAY_SIZE(useless);
result = g_strconcat(useless[j], buf, NULL);
g_free(buf);
}
}
g_free(dev);
return result;
}
答案 0 :(得分:-1)
您的功能失败的原因是您找到匹配后不会从循环中断。因此,替换可以进行两次,有效地取消自己。
您可以通过这种方式修复和简化功能:
char *useless_device(const char *device) {
int i;
const char *useless[] = { "dsnoop", "hw" };
for (i = 0; i < ARRAY_SIZE(useless); i++) {
int len = strlen(useless[i]);
if (strncmp(device, useless[i], len) == 0 &&
(!device[len] || device[len] == ':')) {
return g_strconcat(useless[i ^ 1], device + len, NULL);
}
}
return NULL;
}
这也适用于具有多对名称的数组进行交换。