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

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

Восстановить пароль Регистрация
 
x-positive
1 / 1 / 0
Регистрация: 09.02.2011
Сообщений: 21
09.06.2011, 02:22     Обойти использование string.h #1
Мне нужно работать со строками, но не используя <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++ Использование string
использование vector<string> C++
C++ Использование string в многофайловом приложении. Необходимость подключения библиотек и пространства имён
Использование кириллицы с типом string C++
Использование переменной под string в функциях C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OstapBender
 Аватар для OstapBender
581 / 519 / 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
4838 / 3237 / 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
Ответ Создать тему
Опции темы

Текущее время: 08:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru