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

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

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

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

09.06.2011, 02:22. Просмотров 404. Ответов 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++
Даны текстовая строка и слово (например, ba). Напечатать все слова, входящие в эту текстовую строку, начинающиеся с букв заданного слова...

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

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

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

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

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

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

Использование string в многофайловом приложении. Необходимость подключения библиотек и пространства имён - C++
Здравствуйте. Есть заголовочный и cpp файлы. В заголовочном пишу#ifndef MODEL_H #define MODEL_H struct Vertex { float x, y, z; ...

Как используя C-String а потом и String class варьировать вывод? - C++
Дана задача: при вводе полного И.О.Ф. (в таком порядке) выводить Ф, И и О(только первую букву и .). И если О не задано - выводить только...

Где и почему используют ту или иную строку std::string, char[], System::String^ ? - C++
Где и почему используют ту или иную строку std::string, char, System::String^ ? Объясните пожалуйста где нужно использовать...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
4821 / 3241 / 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';
        }
    }
Ответ Создать тему
Опции темы

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