Замена одного символа в строке несколькими символами в C - PullRequest
0 голосов
/ 08 февраля 2019

Если у меня есть строка следующего содержания: «Dragonballs - это круто».

, но я хочу изменить пробелы на несколько строк: «---»

Так что это будетКонечный результат: Dragonballs --- это круто.

Как бы я это сделал?Нужен ли цикл (я знаю, как заменить отдельные символы другим отдельным символом), или есть другой способ?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Я сделал пример программы, которую вы можете изучить, если хотите.Самая большая проблема, с которой вы столкнетесь при замене подстрок, заключается в том, что вам может понадобиться больше места, чем в исходной строке.Поэтому обычно вы хотите написать измененную исходную строку в другом месте.Вы можете использовать полезные функции, такие как strncat и strncmp, чтобы обойти ситуации, когда у вас есть целевой буфер, который может быть меньше, чем расширенный источник.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_BUF_LEN         32
#define MIN(p,q)            ((p) < (q) ? (p) : (q))


void replace (const char *src, char *buf, size_t buf_size, const char *pat, const char *rep) {
    size_t pat_len = strlen(pat), rep_len = strlen(rep);
    int inc, i = 0;
    const char *p = NULL;

    while (*src != '\0') {

        // Here, if we detect a match, we set our copy pointer and increment size.
        if (strncmp(src, pat, pat_len) == 0) {
            inc = MIN(buf_size - i - 1, rep_len);
            p = rep;
        } else {
            inc = MIN(buf_size - i - 1, 1);
            p = src;
        }

        // If we ran out of room in the buffer, we break out of the loop here.
        if (inc <= 0) break;

        // Here we append the chosen buffer with the increment size. Then increment our indexes.
        buf = strncat(buf, p, inc);
        i += inc;
        ++src;
    }

    // Don't forget the null-character.
    buf[i] = '\0';
}

int main (void) {
    const char *src = "Hello World!";
    const char *match = " ";
    const char *repl = "...";
    char buf[MAX_BUF_LEN] = {0};

    replace(src, buf, MAX_BUF_LEN, match, repl);

    fprintf(stdout, "The string \"%s\" has been transformed to \"%s\"\n", src, buf);
    return EXIT_SUCCESS;
}
0 голосов
/ 08 февраля 2019

Есть несколько способов сделать это.Один из способов - сначала токенизировать строку, чтобы выяснить, где находятся пробелы, например, с помощью strtok.

Затем скопируйте по очереди различные подстроки (слова) в новую строку (массив символов), например, с помощью strcat.Для каждой копируемой строки также скопируйте строку "---".

Альтернатива состоит в том, чтобы сделать все это вручную без вызова каких-либо функций библиотеки строк.

Да, вам понадобятся циклы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...