2016-01-21 3 views
1

значения:Как заменить символы перед определенным символом?

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

Я рекомендую вам прочитать ['strchr'] (http://en.cppreference.com/w/c/string/byte/strchr), [' strcpy'] (http: //en.cppreference .com/w/c/string/byte/strcpy) и ['strcat'] (http://en.cppreference.com/w/c/string/byte/strcat), они все, что вам нужно (плюс временный буфер). –

+0

Похож на вещь ALSA. Не уверен, но нет ли уже функций для дифференциации устройств, а не для разбора последовательностей символов? – Olaf

ответ

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

Это также будет работать с массивом с несколькими парами имен свопа.

Смежные вопросы