Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Stason676
Заблокирован
1

Поиск и замена в строке items подстрок subStr на fStr

16.11.2013, 13:12. Просмотров 668. Ответов 3
Метки нет (Все метки)

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
 
/*Поиск и замена в строке items подстрок subStr на fStr
и возвращение указателя на новую строку.*/
char* Replace(char* items, char* subStr, char* fStr)
{
    size_t count = 0;   //Счетчик для посчета совпадений в строке.
    char *p1, *p2;      //Временные указатели (для копирования строк).
    char* newStr;       //Указатель на новую строку.
 
    for (size_t i = 0; items[i]; i++)
    {
        //Выставить указатели на начало входящей строки и новой строки.
        p1 = &items[i];
        p2 = subStr;
 
        //Сравниваем заменяемую последовательность с заменяемой.
        while(*p2 && *p2 == *p1)
        {
            p1++;
            p2++;
        }
 
        //Инкремент счетчика совпадений.
        if (!*p2) count++;
    }
 
 
    //Выделяем новый блок памяти для новой строки.
    size_t newLength = \
        (strlen(items) - strlen(subStr) * count) + strlen(fStr) * count + 1;
    newStr = (char*)malloc(newLength * sizeof(char));
    memset(newStr, '\0', newLength);
 
    //count теперь указывает на индекс в новой строке.
    count = 0;
    for (size_t i = 0; items[i]; i++)
    {
        p1 = &items[i];
        p2 = subStr;
 
        while(*p2 && *p2 == *p1)
        {
            p1++;
            p2++;
        }
        /*Если не нашло совпадение копирует сивол входящей строки
        в новою строку. Если нашло совпадение копирует заменяющую
        (fStr) строку в конец новой(newStr) строки*/
        if (!*p2)
        {
            p1 = &newStr[count];
            p2 = fStr;
 
            while(*p2)
            {
                *p1++ = *p2++;
                count++;
            }
 
            i += strlen(subStr) - 1;
        }
        else
        {
            p1 = &items[i];
            p2 = &newStr[count];
            *p2 = *p1;
            count++;
        }
    }
 
    return newStr;
}
Здравствуйте профессионалы. Чем можно дополнить, заменить, эту функцию, что бы было профессионально. Спасибо.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2013, 13:12
Ответы с готовыми решениями:

Множественная замена подстрок в строке
Добрый день! Не могу понять в чем дело. Кодю на C. Компилю gcc под Centos 7. Частная задача:...

Поиск и замена подстрок в строке
&quot;Поиск в строке всех вхождений подстрок и их(всех повторений подстроки) на другую...

Замена подстрок в строке
Кто знает, как в данной строке заменить все подстроки &quot;123&quot; на &quot;456&quot;?

Поиск в файле и замена подстрок используя string
Мне надо сделать замену всех подстрок в файле С++ средства ограничены std. То есть std::string и...

Поиск повторяющихся подстрок в строке
Дана строка символов например &quot;авсавсавс&quot;. Необходимо найти повторение &quot;авс&quot; и указать сколько...

3
easybudda
Модератор
Эксперт JavaЭксперт CЭксперт С++
10576 / 6283 / 1574
Регистрация: 25.07.2009
Сообщений: 11,973
16.11.2013, 15:55 2
Цитата Сообщение от Stason676 Посмотреть сообщение
#include <iostream>
Это из С++, там такие задачи совсем по-другому решаются.
Мелкостудия это не скомпилирует - она стандарт ANSI C 99 не поддерживает
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/* ANSI C 99 */
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
char * replace_substring(char * restrict str, const char * restrict sub, const char * restrict repl, const size_t maxlen) {
    char buf[maxlen], * pStr, *pBuf;
    size_t subLen, replLen;
    
    memset(buf, '\0', maxlen);
    subLen = strlen(sub);
    replLen = strlen(repl);
    pBuf = buf;
    pStr = str;
    
    while ( *pStr ) {
        if ( maxlen - ( pBuf - buf ) == 1 )
            break;
        else if ( strncmp(pStr, sub, subLen) )
            *pBuf++ = *pStr++;
        else {
            if ( pBuf - buf + replLen > maxlen - 1 )
                break;
            strcpy(pBuf, repl);
            pBuf += replLen;
            pStr += subLen;
        }
    }
    
    return strcpy(str, buf);
}
 
/**************************************/
typedef char string_t[256];
#define get_string(s) ( scanf("%255[^\n]%*c", (s)) == 1 )
 
int main(void) {
    string_t str, sub, repl;
    
    while ( printf("String: ") && get_string(str) &&
           printf("Substring: ") && get_string(sub) &&
           printf("Replacment: ") && get_string(repl)
    )
           printf("Result: %s\n", replace_substring(str, sub, repl, sizeof(string_t)));
    
    return 0;
}
Поиск и замена в строке items подстрок subStr на fStr
1
Stason676
Заблокирован
16.11.2013, 16:40  [ТС] 3
restrict-квалификация указателей в C99 означает, что данные, на которые указывают такие указатели не указывают на пересекающиеся объекты. Эта информация позволяет компилятору безопасно применять некоторые специальные виды оптимизаций. Например, прототипы стандартных функций memcpy и memmove, определенные в C99 отличаются
Мне не понятен этот , как данные могут пересекаться?
0
easybudda
Модератор
Эксперт JavaЭксперт CЭксперт С++
10576 / 6283 / 1574
Регистрация: 25.07.2009
Сообщений: 11,973
16.11.2013, 19:26 4
Цитата Сообщение от Stason676 Посмотреть сообщение
Мне не понятен этот , как данные могут пересекаться?
Данные будут пересекаться, если sub или repl будут указывать на подстроку str. Здесь на самом деле это без разницы, поскольку буквы сначала во временную строку пишутся. А вот если извратиться с перестановками в строке str без выделения дополнительной памяти, тогда ерунда получится.
1
16.11.2013, 19:26
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2013, 19:26

Поиск нескольких подстрок в строке
Здравствуйте! Есть строка типа: rt!.{username}?{username}@{username}.api.set.com TEST #{count}...

Поиск всех подстрок в строке
Друзья, помогите с таким вопросом: Есть строковая переменная с содержимым (получаю из текстового...

Поиск всех подстрок в строке
Всем доброго времени суток. Есть файл, допусти след. содержания: &lt;meta...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.