如何在特定字符之前替换字符?

时间:2016-01-21 18:22:51

标签: c

值:

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;
}

1 个答案:

答案 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;
}

这也适用于具有多对名称的数组进行交换。