Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Создание массива char`ов и обрезка строки


Автор: Igor_K 8.4.2008, 21:59
Доброго времени суток!

Собственно задача. Нужно небольшую программу перевести под..... Turbo C++ 3.0. И у меня возникли некоторые проблемы с строками. Там я использовал string и все было ок, но тут нужно заменить все строки на char и у меня тут возникли проблемы :(

Нужно создать массив char`ов
Было: std::string el[20];
Нужно создать массив из 20 елементов типа char. Желательно чтобы char был не фиксированного размера. Как создать такое? Ну или хотябы фиксированной длины... но у меня не выходит.

Вопрос №2. Как обрезать строку char??? Я имею ввиду аналог метода substr объекта string. Есть ли аналог ?

Всем спасибо большое заранее!!!!!

Автор: archimed7592 8.4.2008, 22:07
Цитата(Igor_K @  8.4.2008,  21:59 Найти цитируемый пост)
Было: std::string el[20];
Нужно создать массив из 20 елементов типа char.

Это вещи "немного" разные smile.
Было: 20 строк произвольной длины.
Нужно: строку на 20(точнее 19) символов smile.


Цитата(Igor_K @  8.4.2008,  21:59 Найти цитируемый пост)
Как создать такое?

Не поверишь: char str[20]; smile.


Цитата(Igor_K @  8.4.2008,  21:59 Найти цитируемый пост)
Вопрос №2. Как обрезать строку char??? Я имею ввиду аналог метода substr объекта string. Есть ли аналог ?

Обрезать можно так: str[i] = '\0';, где i - номер символа по который нужно обрезать, но substr не обрезает - он создаёт новую строку соответствующую заданой подстроке. Аналогичное можно проделать так:
Код

char *substr(char *str, size_t startPos, size_t len)
{
    str[startPos + len] = '\0';
    return str + startPos;
}
Но, эта ф-ция:
1. Модифицирует переданную ей строку!
2. Вернёт указатель на ту же строку(просто сдвинутый).

Автор: Igor_K 8.4.2008, 22:27
archimed7592, спасибо большое за обьяснение!!!! smile 
с 2 заданием понял, немного подправлю под себя и будет ок.

но 1 задания...

Цитата(archimed7592 @  8.4.2008,  22:07 Найти цитируемый пост)
Нужно: строку на 20(точнее 19) символов smile.


Не поверишь: char str[20]; smile.


Не, немного не то. Так же я создам массив char из 19 символов. так?
Мне нужно массив строк. То есть , например массив имеет 20 елементов, каждый елемент - тоже массив char . Ну похоже это на двумерный массив. Но как его заполнять???
Например код:
Код

char str[20][20];
  int i;
  for (i = 0; i < 20; i++)
  {
    str[i] = "abcdef";
  }


не работает. Вы не знаете как правильно сделать?

Автор: creatorcode 8.4.2008, 23:14
Цитата(Igor_K @  8.4.2008,  22:27 Найти цитируемый пост)
char str[20][20];
  int i;
  for (i = 0; i < 20; i++)
  {
    str[i] = "abcdef";
  }


Код

char str[20][20];
  int i;
  for (i = 0; i < 20; i++)
  {
    strcpy(s[i],"abcdef");
  }

Автор: archimed7592 9.4.2008, 11:00
Цитата(Igor_K @  8.4.2008,  22:27 Найти цитируемый пост)
не работает. Вы не знаете как правильно сделать? 

Так присваивать нельзя... Так можно только инициализировать. "Присваивать" можно было бы так как показал creatorcode... либо так:
Код

char *strArray[20];
strArray[5] = "Привет";

Но, учти, что этот "привет" нельзя будет изменять.
Прочитай для начала прикреплённую тему "Указатели, строки, классы и пр.".

Автор: Igor_K 9.4.2008, 11:24
 smile 

archimed7592, creatorcode, спасибо вам огромное!!! Вы меня спасли от злого препода со старым компилятором!! smile 

Автор: Igor_K 9.4.2008, 13:02
Кажись я рано радовался :( Чето не выходит у меня сделать функцию, которая будет возвращать часть строки переданной в параметре. ну аналог метода substr объекта string.
эта функция 
Код

char *substr(char *str, size_t startPos, size_t len)
{
    str[startPos + len] = '\0';
    return str + startPos;
}
изменяет строку переданую в параметре, а мне надо, чтобы не изменяла.
Есть у когото мысли как это сделать?

Автор: archimed7592 9.4.2008, 13:12
Код

char *substr(const char *baseStr, size_t startPos, size_t len)
{
    char *result = (char *)malloc(len + 1);
    strncpy(result, baseStr + startPos, len);
    result[len] = '\0';
}

int main()
{
    char str[] = "Привет, Вася!":
    char *str2 = substr(str, 8, 4);
    printf("%s\n", str2);
    free(str2); // <<==================== очень важный момент: освободить память
}

Автор: xvr 9.4.2008, 13:20
Цитата(Igor_K @ 9.4.2008,  13:02)
Кажись я рано радовался :( Чето не выходит у меня сделать функцию, которая будет возвращать часть строки переданной в параметре. ну аналог метода substr объекта string.
эта функция 
Код

char *substr(char *str, size_t startPos, size_t len)
{
    str[startPos + len] = '\0';
    return str + startPos;
}
изменяет строку переданую в параметре, а мне надо, чтобы не изменяла.
Есть у когото мысли как это сделать?

При такой постановке вопроса - никак. Возвращаемый char* - это еще не строка, еще нужно место, куда это будет указывать. Т.е. нужно или динамически заказать память и разместить строку там, либо использовать статический буфер под строку (NB. Никогда так не делайте!)
Недостатки
  •  Динамическая память (см malloc или strdup) - кто то эту память должен в конце концов освободить (см free)
  •  Статический буфер (static char buffer[1000000]; в теле функции) - буфер может переполнится (какого бы размера он не был), строка возвращенная из второго вызова такой функции перезапишет строку, возвращенную из первого вызова (т.к. физически это будет одна и таже строка)
  •  Буффер, куда писать, передается параметром - изменения в интерфейсе функции.

Автор: Igor_K 9.4.2008, 14:13
archimed7592, xvr, спасибо за пример!!! smile 
Теперь окончательно разобрался благодаря вам!!!
 ! 
archimed7592
Ну дык не пренебрегай кнопочкой "пометить вопрос решённым"...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)