Заменить символ в строке на строку в C - PullRequest
0 голосов
/ 07 декабря 2018

Позвольте следующий пример кода:

char s1[] = "Hey there #!";
char s2[] = "Lou";

Я хотел бы написать функцию, которая заменяет '#' на значение s2 .Также он динамически распределяет память для новой выходной строки, которая имеет новую замененную версию.Возможно ли это элегантным и несложным способом, используя в основном встроенные функции?Я знаю, как заменить символы на символы в строке или строки на заданную подстроку, но эта, кажется, меня опередила.

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Вам придется пройти через несколько функций, но ... вот так:

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

int main()
{
    char s1[] = "Hey there #!";
    char s2[] = "Lou";

    // Get the resulting length: s1, plus s2,
    // plus terminator, minus one replaced character
    // (the last two cancelling each other out).
    char * s3 = malloc( strlen( s1 ) + strlen( s2 ) );

    // The number of characters of s1 that are not "#".
    // This does search for "any character from the second
    // *string*", so "#", not '#'.
    size_t pos = strcspn( s1, "#" );

    // Copy up to '#' from s1
    strncpy( s3, s1, pos );

    // Append s2
    strcat( s3, s2 );

    // Append from s1 after the '#'
    strcat( s3, s1 + pos + 1 );

    // Check result.
    puts( s3 );
}

Это не так эффективно, как вы могли бы это сделать (особенно многократные вызовы strcat() неэффективны), но он использует только стандартные функции самым «простым» способом и не выполняет никаких «указателей».

0 голосов
/ 07 декабря 2018

Нет единого вызова libc, но это возможно при использовании нескольких вызовов libc, что-то вроде ниже, без необходимости динамического выделения.

    #include <stdio.h>
    #include <string.h>
    char* replace_string(char* str, char* find, char* replace_str)
    {
        int len  = strlen(str);
        int len_find = strlen(find), len_replace = strlen(replace_str);
        for (char* ptr = str; ptr = strstr(ptr, find); ++ptr) {
            if (len_find != len_replace) 
                memmove(ptr+len_replace, ptr+len_find,
                    len - (ptr - str) + len_replace);
            memcpy(ptr, replace_str, len_replace);
        }
        return str;
    }

    int main(void)
    {
        char str[] = "Hey there #!";
        char str_replace[] = "Lou";
        printf("%s\n", replace_string(str, "#", str_replace));
        return 0;
    }

вывод:

Hey there Lou!
0 голосов
/ 07 декабря 2018

Проверьте это https://stackoverflow.com/a/32496721/5326843 В соответствии с этим не существует стандартной функции для замены строки.Вы должны написать свой собственный.

...