Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

09.06.2011, 02:22. Просмотров 441. Ответов 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() мы получаем указатель на вхождение подстроки, в этом месте мне нужно вставить подстроку, скажем пробел или набор символов. При этом строка динамически увеличивает свой размер. Поможете разобраться?)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2011, 02:22
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Обойти использование string.h (C++):

Заменить использование istringstream на вариант из string или string.h - C++
Как заменить 14 строку функцией из &lt;string&gt; или &lt;string.h&gt; и без &lt;sstream&gt; {deleted} П.5.19.Правил Запрещено создавать темы в виде...

Использование string - C++
Даны текстовая строка и слово (например, ba). Напечатать все слова, входящие в эту текстовую строку, начинающиеся с букв заданного слова...

Использование класса String - C++
//Èñïîëüçîâàíèå êëàññà string. #include &lt;iostream&gt; #include &lt;string.h&gt; using namespace std; class String { public: ...

Использование vector<string> - C++
Задание: Задана строка S, содержащая не менее двух слов, и символ с. Составит новую строку S1 из слов строки S, в которых есть символ с,...

Использование библиотечных функций string.h - C++
Задание 3. Использование библиотечных функций string.h 1. Даны текстовая строка и слово (например, ba). Напечатать все слова, входящие в...

Использование кириллицы с типом string - C++
Здравствуйте.В данном коде происходит ошибка при работе с кириллицей: string england = &quot;abcdefghijklmnopqrstuvwxyz&quot;; string symbol =...

2
OstapBender
584 / 523 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
09.06.2011, 02:53 #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);
0
accept
4831 / 3252 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
09.06.2011, 04:08 #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';
        }
    }
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2011, 04:08
Привет! Вот еще темы с ответами:

Использование переменной под string в функциях - C++
Всем привет, извините если заголовок не подходит! Вообщем у меня проблема, я не могу понять как нужно сделать чтобы все правильно было ...

Использование контейнера string из библиотеки STL - C++
Дан массив слов. Сформировать новое слово из символов слов массива, стоящих после последнего символа ‘*’ в слове. Сформировать предложение...

использование класса string.объясните плз - C++
Есть вот такой код: int x = s1.find ( ' ' ); // ищем пробелы while ( x &lt; s1.size ( ) ) // цикл по всем пробелам {...

Использование strlen для объектов типа string - C++
Подскажите пожалуйста, как strlen использовать на string.


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

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

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