Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2010, 16:51   #1
Nike0
 
Регистрация: 26.10.2009
Сообщений: 6
По умолчанию Строки в Си

появился вопрос, когда строка для поиска равна заменяемой, все проделывает, только немного кривовато, а когда больше или меньшее вообще зацикливается, может кто найти ошибку?
Код:
#include <stdio.h>
#pragma hdrstop
#include <conio.h>
#include <tchar.h>
#include <string.h>
#define N 80
#pragma argsused
 
int main()
{
        char s[N],s1[N],s2[N];
        int n;
        clrscr();
        printf("Vvedite stroku s:\n");
        gets(s);
        printf("\nVvedite stroku s1:\n");
        gets(s1);
        printf("\nVvedite stroku s2:\n");
        gets(s2);
        for (n = 0; s[n] != '\0'; n++)
        {
        int i;
                for (i=0; s[n+i] !='\0' && s1[i] !='\0'; i++)
                        if (s[n+i] != s1[i])
                                break;
                if (s1[n+i]=='\0')
                {
                        int l2,dd,k;
                        l2 = strlen(s2);
                        dd = l2 - strlen(s1);
                        if (dd != 0)
                        {
                                if (dd < 0)
                                {
                                        for (k=n; s[k+dd]!='\0'; k++)
                                                s[k] = s[k+dd];
                                                s[k]='\0';
                                }
                                else
                                {
                                        for (k=n; s[k]!='\0'; k++)
                                                for (; k != n; k--)
                                                        s[k+dd] = s[k];
 
                                }
                        }
                        for (k = 0; k < l2; k++)
                                s[n+k] = s2[k];
                }
        }
        printf("%s",s);
        getch();
        return 0;
}
Nike0 вне форума Ответить с цитированием
Старый 10.12.2010, 16:56   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Можем найти. - ответ на вопрос.
А на счет подсказки,
Код:
if (dd != 0)
                        {
                                if (dd < 0)
                                {
                                        for (k=n; s[k+dd]!='\0'; k++)
                                                s[k] = s[k+dd];
                                                s[k]='\0';
                                }
                                else
                                {
                                        for (k=n; s[k]!='\0'; k++)
                                                for (; k != n; k--)
                                                        s[k+dd] = s[k];
 
                                }
                        }
где-то здесь. Проверить, введите две строки, одинаковой длины, если будет работать, то ошибка в этом участке кода. Мне с первого взгляда трудно понять логику манипуляций с dd переменной.
BOBAH13 вне форума Ответить с цитированием
Старый 10.12.2010, 16:58   #3
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Я готов только предложить наверняка никому не нужный свой, более короткий, вариант, так как ошибку искать леновенько:
Код:
#include <string.h>

bool strrepl(char *target, int bufsize,
			 const char *oldsubstr,
			 const char *newsubstr)
{
	if(!*oldsubstr)
		return false;

	int targlen = strlen(target),
		oldlen = strlen(oldsubstr),
		newlen = strlen(newsubstr);
	if(targlen - oldlen + newlen >= bufsize)
		return false;

	char *substr = strstr(target, oldsubstr);
	if(substr)
	{
		memmove(substr+newlen, substr+oldlen, strlen(substr)-oldlen+1);
		strncpy(substr, newsubstr, newlen);
		return true;
	}

	return false;
}
Возвращает true, если замена произошла, false в противном случае.
То есть заменить все вхождения старой подстроки новой моно так:
Код:
while(strrepl(str, sizeof(str), oldstr, newstr));
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 13.12.2010, 12:34   #4
Nike0
 
Регистрация: 26.10.2009
Сообщений: 6
По умолчанию

dd у меня для сдвига вправо-влево, месторасположение ошибки тоже знаю, только не знаю как исправить

Спасибо, счас заценим код

Цитата:
Сообщение от Syuf Посмотреть сообщение
Возвращает true, если замена произошла, false в противном случае.
То есть заменить все вхождения старой подстроки новой моно так:
Код:
while(strrepl(str, sizeof(str), oldstr, newstr));
т.е это цикл do ... while? внутри написать цикл замены подстроки s2 на s, я правильно понял?

Последний раз редактировалось Stilet; 13.12.2010 в 13:48.
Nike0 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание пустой строки и копирование в неё содержимое предыдущей строки Gvaridos Microsoft Office Excel 2 29.10.2010 13:33
Дбавление новой строки, после строки с подходящими параметрами RailOS Microsoft Office Excel 5 18.08.2010 10:12
Определять максимальную длину той части строки s, которая не содержит символы из строки s1. Александе еть я Общие вопросы C/C++ 5 13.04.2010 20:54
Перенести символа с начала строки в место перед запятой этой же строки. Zhiltsov Microsoft Office Excel 4 05.06.2009 13:10
считать из файла две строки, вывести на экран символы первой строки, которые отсутствуют во второй gotex Помощь студентам 4 08.05.2008 02:27