Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание массива char`ов и обрезка строки, Я не знаю... 
V
    Опции темы
Igor_K
Дата 8.4.2008, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 4.2.2008
Где: Kyiv

Репутация: нет
Всего: нет



Доброго времени суток!

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

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

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

Всем спасибо большое заранее!!!!!
PM MAIL   Вверх
archimed7592
Дата 8.4.2008, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(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. Вернёт указатель на ту же строку(просто сдвинутый).

Это сообщение отредактировал(а) archimed7592 - 8.4.2008, 22:10


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Igor_K
Дата 8.4.2008, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 4.2.2008
Где: Kyiv

Репутация: нет
Всего: нет



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";
  }


не работает. Вы не знаете как правильно сделать?
PM MAIL   Вверх
creatorcode
Дата 8.4.2008, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 12.6.2006
Где: Ленинград

Репутация: 1
Всего: 4



Цитата(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");
  }

PM MAIL   Вверх
archimed7592
Дата 9.4.2008, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



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

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

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

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



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Igor_K
Дата 9.4.2008, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 4.2.2008
Где: Kyiv

Репутация: нет
Всего: нет



 smile 

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

Это сообщение отредактировал(а) Igor_K - 9.4.2008, 11:31
PM MAIL   Вверх
Igor_K
Дата 9.4.2008, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 4.2.2008
Где: Kyiv

Репутация: нет
Всего: нет



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

char *substr(char *str, size_t startPos, size_t len)
{
    str[startPos + len] = '\0';
    return str + startPos;
}
изменяет строку переданую в параметре, а мне надо, чтобы не изменяла.
Есть у когото мысли как это сделать?
PM MAIL   Вверх
archimed7592
Дата 9.4.2008, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Код

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); // <<==================== очень важный момент: освободить память
}



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
xvr
Дата 9.4.2008, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(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]; в теле функции) - буфер может переполнится (какого бы размера он не был), строка возвращенная из второго вызова такой функции перезапишет строку, возвращенную из первого вызова (т.к. физически это будет одна и таже строка)
  •  Буффер, куда писать, передается параметром - изменения в интерфейсе функции.

PM MAIL   Вверх
Igor_K
Дата 9.4.2008, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 4.2.2008
Где: Kyiv

Репутация: нет
Всего: нет



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


Это сообщение отредактировал(а) archimed7592 - 9.4.2008, 14:46
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0934 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.