Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
goga0881
Зарегистрирован: 14.04.2005 Сообщения: 21
|
Добавлено: Пт Апр 15 2005 20:15 Заголовок сообщения: Как задавать массив символов без размера? |
|
|
Всем привет. Я хочу написать прогу, которая будет выдавать самую длинную строчку, которая будет хранится в массиве символов
char longest[]. Проблема в том, что я не могу обявить массив не указав его размер. А задача заключается в том, чтобы длина массива определялась в соответствии с длиной введенной строки.
Короче я не могу обявить char longest[], надо обязательно указать его длину, точнее размерность. Как это сделать? |
|
Вернуться к началу |
|
|
droopy
Зарегистрирован: 28.07.2004 Сообщения: 168
|
Добавлено: Пт Апр 15 2005 22:04 Заголовок сообщения: |
|
|
использовать с++
vector< char > |
|
Вернуться к началу |
|
|
goga0881
Зарегистрирован: 14.04.2005 Сообщения: 21
|
Добавлено: Сб Апр 16 2005 19:17 Заголовок сообщения: Re: Как задавать массив символов без размера? |
|
|
goga0881 писал(а): | Всем привет. Я хочу написать прогу, которая будет выдавать самую длинную строчку, которая будет хранится в массиве символов
char longest[]. Проблема в том, что я не могу обявить массив не указав его размер. А задача заключается в том, чтобы длина массива определялась в соответствии с длиной введенной строки.
Короче я не могу обявить char longest[], надо обязательно указать его длину, точнее размерность. Как это сделать? |
А как все это реализовать в языке С? Это задача приводится в книге Кернигана и Ритчи. Наверное есть возможность. |
|
Вернуться к началу |
|
|
droopy
Зарегистрирован: 28.07.2004 Сообщения: 168
|
Добавлено: Сб Апр 16 2005 22:25 Заголовок сообщения: |
|
|
используй указатели, и функции malloc & realloc
это для с
но паочему не с++? |
|
Вернуться к началу |
|
|
Artur
Зарегистрирован: 18.01.2005 Сообщения: 13
|
Добавлено: Сб Апр 16 2005 22:32 Заголовок сообщения: |
|
|
Это очень просто char longest[strlen( тут твоя строка)]
не забудь в верху "инклюды":
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
Да и ещё твоя строка должна уже быть. Как ты собыраешься вводить строку? Если с клавы то тебе нужны будут дополнительные функции чтения буфера клавы!
Да и ещё, ты так только отведешь массив, тебе ещё надо будет туда свою строку скопировать и для этого тоже будут нужны дополнительные функции.
Удачи! |
|
Вернуться к началу |
|
|
Kitaro
Зарегистрирован: 16.01.2005 Сообщения: 9
|
Добавлено: Вс Апр 17 2005 06:13 Заголовок сообщения: Re: Как задавать массив символов без размера? |
|
|
goga0881 писал(а): | Всем привет. Я хочу написать прогу, которая будет выдавать самую длинную строчку, которая будет хранится в массиве символов
char longest[]. Проблема в том, что я не могу обявить массив не указав его размер. А задача заключается в том, чтобы длина массива определялась в соответствии с длиной введенной строки.
Короче я не могу обявить char longest[], надо обязательно указать его длину, точнее размерность. Как это сделать? |
Могу предложить способ не требующий ничего кроме большой памети
char longest[10000]. |
|
Вернуться к началу |
|
|
Aragaer
Зарегистрирован: 28.03.2005 Сообщения: 164
|
Добавлено: Вс Апр 17 2005 14:50 Заголовок сообщения: |
|
|
Посмотрел задачку. Хорошая задачка.
По умолчанию создается массив в 1000 символов.
Затем мы читаем в него не более 1000 символов.
Предлагается написать код, который бы обрабатывал случай, когда мы прочли ровно 1000 символов, а строка на этом не закончилась. То есть нужно динамически выделить еще памяти, скопировать туда уже прочитанный кусок строки и продолжить чтение.
Проблема в том, что эта задачка расположена в самом начале книги и ни о каких malloc'ах речи еще не идет. _________________ Open your eyes.
And Awaken. |
|
Вернуться к началу |
|
|
Kitaro
Зарегистрирован: 16.01.2005 Сообщения: 9
|
Добавлено: Вс Апр 17 2005 16:23 Заголовок сообщения: Re: Как задавать массив символов без размера? |
|
|
goga0881 писал(а): |
Короче я не могу обявить char longest[], надо обязательно указать его длину, точнее размерность. Как это сделать? |
вот ещё способ :
char * buff;
buff=getline(); // возможна другая ф-ия смотря откуда читаешь
int i=0;
while (buff[i]!='\0')
{
i++;
}
так узнаешь длину текущей строки а далее .... |
|
Вернуться к началу |
|
|
критикан
Зарегистрирован: 18.02.2005 Сообщения: 247
|
Добавлено: Пн Апр 18 2005 10:46 Заголовок сообщения: не надо путать божий дар с яичницей |
|
|
Aragaer писал(а): | Посмотрел задачку. Хорошая задачка.
Проблема в том, что эта задачка расположена в самом начале книги и ни о каких malloc'ах речи еще не идет. |
разные аллоки -- это не элемент языка, а просто библиотечные функции. поэтому их использование допустимо хучь в начале, хучь в конце. от этого логика изложения не нарушается
---------------------
не надо путать божий дар с яичницей |
|
Вернуться к началу |
|
|
Destructor
Зарегистрирован: 28.01.2005 Сообщения: 6
|
Добавлено: Пн Апр 18 2005 13:38 Заголовок сообщения: |
|
|
Цитата: |
char * buff;
buff=getline(); // возможна другая ф-ия смотря откуда читаешь
int i=0;
while (buff[i]!='\0')
{
i++;
}
|
Этот код работать не будет... |
|
Вернуться к началу |
|
|
Kitaro
Зарегистрирован: 16.01.2005 Сообщения: 9
|
Добавлено: Ср Апр 20 2005 18:31 Заголовок сообщения: |
|
|
Destructor писал(а): |
Этот код работать не будет... |
...Заодно , PLZ , скажи в чем ошибка.
getline это чисто символическая точка ввода строки.
Rgrds & Thnks |
|
Вернуться к началу |
|
|
Aragaer
Зарегистрирован: 28.03.2005 Сообщения: 164
|
Добавлено: Чт Апр 21 2005 00:32 Заголовок сообщения: |
|
|
Функция getline() возвращает количество считанных символов, а вовсе не указатель на прочитанную строчку. При попытке обращения к элементам такого "массива" произойдет, почти наверняка, segmentation fault.
критикан писал(а): | разные аллоки -- это не элемент языка, а просто библиотечные функции. поэтому их использование допустимо хучь в начале, хучь в конце. от этого логика изложения не нарушается |
Указатели являются элементом языка, а в них нужно ориентироваться, чтобы пользоваться этими библиотечными функциями. Первое упоминание об указателях появляется где-то через 80 страниц. Задача находится в самой первой - обзорной главе. В частности здесь есть простая операция copy, вместо которой можно было бы воспользоваться библиотечной strcpy, но для простоты понимания из библиотек подключается только stdio.h, из которой берутся только функции printf() и getchar(). _________________ Open your eyes.
And Awaken. |
|
Вернуться к началу |
|
|
Andrey Grigoriev
Зарегистрирован: 24.06.2004 Сообщения: 17 Откуда: Орел, Россия
|
Добавлено: Сб Апр 23 2005 12:17 Заголовок сообщения: |
|
|
Artur писал(а): | Это очень просто char longest[strlen( тут твоя строка)]
|
Такой код проглотит только гнутый компилятор.
Выделять память через malloc - самый правильный метод. Главное не забыть ее потом освободить |
|
Вернуться к началу |
|
|
NewFork
Зарегистрирован: 28.02.2005 Сообщения: 73
|
Добавлено: Пт Май 13 2005 06:34 Заголовок сообщения: |
|
|
Два самых простых варианта....
Код: |
#include <strings.h>// Точно не помню, но помоему здесь этот тип описан
AnsiString Variable
|
Не нужно ни выделять память, не освобождать, строка имеет длину до 4ГБ помоему должно хватить по самые уши...
Ну и с динамическими массивами...
Код: |
char*Variable;
Variable=new char[n]
...
что-то делаем...
...
delete Variable
|
n совершенно любое число |
|
Вернуться к началу |
|
|
DmitryShm
Зарегистрирован: 17.11.2003 Сообщения: 211 Откуда: Казань
|
Добавлено: Пт Май 13 2005 14:04 Заголовок сообщения: а можно и еще.. |
|
|
А еще можно замутить использования SmartPointers, и для твоего массива сделать счетчик ссылок. _________________ love IT |
|
Вернуться к началу |
|
|
|