Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
x-positive
1 / 1 / 0
Регистрация: 09.02.2011
Сообщений: 21
#1

Обойти использование string.h - C++

09.06.2011, 02:22. Просмотров 398. Ответов 2
Метки нет (Все метки)

Мне нужно работать со строками, но не используя <string.h>
В частности я создал две функции, которые нужны мне при работе.
Первая должна полностью копировать действие strstr(), а вторая должна вставлять в строку s подстроку s1 на место, куда указывает указатель p, при этом остальная часть строки "сдвигается" на столько символов вправо, сколько содержит подстрока s1.

Но ни та ни другая не выполняют свою работу.
Помогите мне найти ошибки или предложите свой вариант, как можно выполнить те же действия.

Вот эти функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
char* StrStr(char*s,char*s1)
{
 char *p="";
 int i,j,scop=0,found=0;
 
 for (i=0; s1[scop]!='\0'; i++)
 {
  if ( s[i] != s1[scop] ) { p=""; scop=0; found=0; }
  else { scop++; if (p=="") { for (j=0; s[j]!='\0';j++) p[j]=s[j+i]; found=1; p[j]='\0'; }}
 }
 if (!found) p=NULL;
 return p;
}
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
char* StrIns(char*s,char*s1,char*p)
{
 int i,j,len_P,len_S;
 char *pcopy=p;
 p=s;
 
 for(i=0; s[i]!='\0'; i++); len_S=i;
 for(i=0; p[i]!='\0'; i++); len_P=i;
 
 for(i=0; len_S-len_P; i++) p[i]=s[i];
 p[i]='\0';
 
 for(i=0; p[i]!='\0'; i++); len_P=i;
 
 for(i=0; s1[j]!='\0'; i++) p[i+len_P]=s1[i];
 p[i]='\0';
 
 for(i=len_P; p[i]!='\0'; i++); len_P=i;
 
 for(i=0; pcopy[j]!='\0'; i++) p[i+len_P]=pcopy[i];
 s[i]='\0';
 
 return p;
}
Добавлено через 2 часа 20 минут
Я нашёл функцию, подобную strtstr, но понять всё не в состоянии.
То есть понимаю как где что работает, но когда пытаюсь поменять хоть что нибудь на более простенькое для меня, но с большим количеством строк - перестаёт работать.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
char* StrStr(char*s, char*s1)
{
 char *copy_s = s1, *copy_s1;
 while (*s)
  {
   copy_s1 = s;
   while(*(s++) == *(s1++))
    {
     if (!(*s1)) return copy_s1;
     if (!(*s)) return NULL;
    }
   s1 = copy_s;
  }
 return NULL;
}
И для меня остаётся открытым вопрос - как вставить подстроку в строку с заданной указателем позиции. (То есть после поиска функцией StrStr() мы получаем указатель на вхождение подстроки, в этом месте мне нужно вставить подстроку, скажем пробел или набор символов. При этом строка динамически увеличивает свой размер. Поможете разобраться?)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2011, 02:22     Обойти использование string.h
Посмотрите здесь:

использование класса string.объясните плз C++
Использование класса String C++
Использование библиотечных функций string.h C++
Обойти конец файла. C++
C++ Использование string
Использование vector<string> C++
Как обойти рекурсию? C++
C++ Использование string в многофайловом приложении. Необходимость подключения библиотек и пространства имён
Использование кириллицы с типом string C++
Использование переменной под string в функциях C++
Создание string из части другого string C++
Использование strlen для объектов типа string C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
09.06.2011, 02:53     Обойти использование string.h #2
Цитата Сообщение от x-positive Посмотреть сообщение
И для меня остаётся открытым вопрос - как вставить подстроку в строку с заданной указателем позиции. (То есть после поиска функцией StrStr() мы получаем указатель на вхождение подстроки, в этом месте мне нужно вставить подстроку, скажем пробел или набор символов. При этом строка динамически увеличивает свой размер. Поможете разобраться?)
ну так strlen(str1)+strlen(str2) +1 длина новой строки
realloc-айте память, записывайте после старой новую строку на нужное место, дописывайте конец, возвращайте строку

Добавлено через 11 минут
примерчик:
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
char* insert(char* str, char* what, int pos) {
 
    if (pos <=0 || pos >=strlen(str)) return NULL;
 
    str = (char*) realloc(str,strlen(str)+strlen(what)+1);
    
    int val=abs((int)(strlen(str)-strlen(what)))+1;        //сори за кривоту здесь, компилер не допускал автоприведения size_t к int 
    char* temp = (char*)malloc(val);
    strcpy(temp,str+pos);
    strcpy(str+pos,what);
    strcpy(str+pos+strlen(what),temp);
 
    free(temp);
 
    return str;
}
 
мейн:
    char *str = (char*) malloc(10);
    strcpy(str,"qwerty");
    insert(str,"1234567890",4);
 
    puts(str);
    
        free(str);
accept
4819 / 3239 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
09.06.2011, 04:08     Обойти использование string.h #3
C++
1
char *p="";
C++
1
char *p = 0;
C
1
char *p = NULL;
C++
1
else { scop++; if (p=="") { for (j=0; s[j]!='\0';j++) p[j]=s[j+i]; found=1; p[j]='\0'; }}
не пиши код в одну строчку
если будет сообщение компилятора: ошибка: в строке 5: в p[j]
то непонятно, про какой оператор это сообщение
придётся разделять строку, чтобы узнать

C++
1
2
3
4
5
6
7
8
9
    else {
        scop++;
        if (p == "") {
            for (j = 0; s[j] != '\0'; j++)
                p[j] = s[j+i];
            found = 1;
            p[j] = '\0';
        }
    }
Yandex
Объявления
09.06.2011, 04:08     Обойти использование string.h
Ответ Создать тему
Опции темы

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